2014-09-30 1 views
2

저는 C#을 처음 사용하고 있으며 배포 소프트웨어 용 플러그인에 사용자 지정 작업을 작성하라는 요청을 받았지만이 문제를 해결할 수 없습니다. 내 배포 서버의 특정 디렉토리에있는 일부 데이터를 출력 로그에 로깅하려하지만 첫 번째 파일 만 기록됩니다 (텍스트가 깨져서 문자가 잘못로드되는 것 같습니다) "추가 정보 : 컬렉션이 수정되었으므로 열거 연산이 실행되지 않을 수 있습니다." 여기 파일에서 깨진 텍스트를 읽는 중 모음이 잘못되었습니다.

내가 지금까지 가지고있는 코드 :

class Clense : AgentBasedActionBase 
{ 
    public string dataPath { get; set; } 

    protected override void Execute() 
    { 
     IFileOperationsExecuter agent = Context.Agent.GetService<IFileOperationsExecuter>(); 
     GetDirectoryEntryCommand get = new GetDirectoryEntryCommand() { Path = dataPath }; 
     GetDirectoryEntryResult result = agent.GetDirectoryEntry(get); 
     DirectoryEntryInfo info = result.Entry; 
     // info has directory information 
     List<FileEntryInfo> myFiles = info.Files.ToList(); 
     foreach (FileEntryInfo file in myFiles) 
     { 
      Byte[] bytes = agent.ReadFileBytes(file.Path); 
      String s = Encoding.Unicode.GetString(bytes); 
      LogInformation(s); 
      // myFiles.Remove(file); 
     } 
    } 
} 

사람이 내가이 문제를 해결하려고 무엇을 할 수 있는지 알고 있나요?

업데이트

는 myFiles.Remove을() 오류를 수정 제거 (나는 루프 너무 많은 시간을 것이라고 생각하지만 그렇지 않습니다) 그리고 지금은 파일 당 하나 개의 로그 항목을 받고 있어요 것 같습니다 메시지는 여전히 깨져 있습니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?

+0

'myFiles'를 열거하면서'myFiles.Remove (file);를 할 수 없습니다. 오류를 검색하기 만하면 [Stackoverflow에서 많은 중복을 찾을 수 있습니다] (http://tinyurl.com/lxpg9ro). –

+0

나는 그것들을 보았다. 그러나 나는 그 파일을 두 번 읽고 싶지 않다. –

+1

유니 코드 대신'Encoding.UTF8'을 사용해보십시오. – Blorgbeard

답변

1

((당신이 손상되지 수집을 할 것을 각 개별 파일을 제거 할 때, 그래서) 당신은 역방향에 myFiles 수집 을 반복 할 수 있습니다, 또는 당신이 그것을 반복 할 때 당신은 단순히 컬렉션을 취소 할 수있는 같은 일을 성취 할 것입니다.)

+0

myFiles는 실제로 다시 사용되지 않으므로 아무 것도 제거하지 않을 수도 있습니다. – Blorgbeard

1

으로 모음을 수정합니다. myFiles.Remove (file); 해당 행을 삭제하십시오 (원인이므로).

0

그의 코멘트에서 Blorgbeard는 디스크의 파일을 읽는 데 사용 된 인코딩과 관련하여 거의 정확합니다. Encoding.Unicode이 실제로는 UTF16이라는 사실을 기억하십시오. 다소 혼란 스럽습니다. 추측 해봐야 파일이 만들어 졌을 수도 있습니다.

protected override void Execute() 
{ 
    var agent = this.Context.Agent.GetService<IFileOperationsExecuter>(); 
    var entry = agent.GetDirectoryEntry(new GetDirectoryEntryCommand() { Path = dataPath }).Entry; 
    foreach(var file in entry.Files) 
    { 
     string contents = agent.ReadAllText(file.Path); 
     this.LogInformation(contents); 
    } 
} 

ReadAllText() 방법은 내부적으로 UTF8 인코딩을 가정하지만, 허용 과부하가있다 : 완성도를 들어

, 나는 IFileOperationsExecuterReadAllText() 확장 방법을 사용하여 시나리오를 처리는 builldmaster-관용적 방법을 추가합니다 필요한 경우 다른 인코딩.

관련 문제