2013-04-12 6 views
0

프로덕션 서버에서 실행되는 응용 프로그램을 개발하는 책임을 맡고 있으며 모든 ini, xml 및 config 파일 확장명에서 특정 문자열을 검색하고 바꿔주는 것을 목표로합니다. 성능 (총 150 대의 서버). 대체하기 전에 파일을 백업해야합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 제쳐두고 Dot Net 4.0을 사용할 수는 있지만 모든 서버에 4.0이 없기 때문에 3.5를 사용하는 것이 바람직하지만 4.0으로 업데이트 할 수있는 큰 이점이있는 경우 바람직합니다. 이제 나는 이런 생각을하고 있습니다 :전체 파일 시스템에서 파일 내용 검색 및 바꾸기에 대한 팁

String[] arrayFiles = Directory.GetFiles(strFylesystem , strExtensao, SearchOption.AllDirectories); 
     foreach (string s in arrayFiles){ 
      File.Copy(pathOrigin + s, pathNew); 
      searchFound = false; 
      foreach (string line in File.ReadAllLines(pathNew + s){ 
       if (line.contains("string_searched")){ 
        line.Replace("string_searched", new_string); 
        searchFound = true; 
       } 
       if (!searchFound){ 
        File.Delete(pathNew + s); 
       } 
      } 
     } 

나는 Lambda, PLINQ e Regular Expression을 사용하는 포럼을 발견했습니다. 개인적인 취향을 넘어, 성능면에서 도움이 될만한 사람이 있습니까? 예를 들면 : File.ReadAllLinesStreamReader을 사용하여 개발하는 대신 사용하면 성능이 좋아질 수 있습니까? windows에서 findStr을 랩핑하고 성능을 향상시킬 수 있습니까?

+0

정말 모든 INI 및 XML 파일이 모든 디스크에 있습니까? – alexn

+2

이것은 Powershell 스크립트의 작업처럼 들립니다. 한 가지 예가 [여기] (http://poshcode.org/1707)에서 찾을 수 있습니다. 면책 조항 : 나는 연결된 스크립트를 시도하지 않았습니다. 자신의 책임하에 사용하십시오. – PHeiberg

+0

이 스크립트를 많이 실행해야합니까? 그것은 거의 당신이 한 번 실행하고 행복하게해야 할 것 같은데 들리 네요. 그렇다면 성능이 왜 중요한가요? – Anthony

답변

0

제한 요소는 디스크 액세스 속도이며, 속도를 높이기 위해 할 수있는 일은 많지 않습니다. 물론 람다 식을 사용하는 것은 성능 차이를 만들지 않을 것입니다.

여러 드라이브가있는 경우가 아니면 병렬 검색으로 도움이되지 않습니다. 즉, 같은 드라이브에있는 서로 다른 디렉토리에서 작동하는 두 개의 스레드를 사용하면 디스크 액세스에 대한 경합이 생기기 때문에 작업 속도가 느려질 수 있습니다.

하나의 잠재적 인 문제는 드라이브의 모든 파일을 열거하는 동안 드라이브에 새 파일을 생성한다는 것입니다. 조심하지 않으면 무한 루프에 빠질 수 있습니다. 즉, x.xml을 읽고 x.new.xml이라는 새 파일을 만든 다음 x.new.xml을 찾고 변경합니다. 전체 드라이브를 검사하고 변경하려는 파일 그런 다음 그 목록을 살펴보고 변경하십시오.

C#에서는이 작업을 수행하지 않는 것이 좋습니다. 대신 두 개의 PowerShell 스크립트를 작성하십시오. 첫 x 째는 드라이브에서 사용자 조건과 일치하는 파일을 검색하고 파일 이름을 파일에 기록합니다. 두 번째 파일은 해당 파일에서 파일 이름을 읽고 파일을 처리합니다. 예를 들어 https://stackoverflow.com/a/60065/56778을 참조하십시오.

아마도 C# 프로그램만큼 빠르지는 않을 것입니다. 그러나 나는 그것이 훨씬 더 느릴 것이라고 생각하지 않습니다. 다시 말하지만, 제한 속도는 처리 속도가 아닌 디스크 액세스 속도입니다. 그리고 개발 시간은 며칠이 아닌 몇 시간이 걸릴 것입니다. PowerShell 스크립트를 수정하는 것이 C# 프로그램을 수정하는 것보다 쉽습니다.

+0

Jim Mischel, 의견에 감사드립니다. 파일을 편집 할 수 있는지 여부를 어떻게 알 수 있습니까? 이전 개발자가 응용 프로그램에서 서버 이름을 설정하는 데 사용했던 모든 확장 기능이 없다고 상상해보십시오. 예를 들어, 어떤 이유로 개발자는 기본적으로 메모장에서 편집 가능한 텍스트 파일 인 my_config.server라는 파일에 서버 이름을 하드 코딩하지만 확장자는 .config 또는 .ini와 다릅니다. 이것이 C#에서 텍스트 파일인지 바이트 코드가 아닌지를 확인하는 안전한 방법이 있습니까? – Demetrio

+0

@Demetrio : 유일한 방법은 파일을 열고 검사하는 것입니다. 파일에 ASCII 문자와 개행 또는 탭만 있으면 편집 할 수 있습니다. 그것은 가장 간단한 경우입니다.파일이 8 비트 인코딩 (예 : 키릴 문자), 유니 코드, UTF-8 또는 일부 멀티 바이트 문자 세트 인 경우 문제가 다소 복잡합니다. –

관련 문제