FileSystemWatcher Created 이벤트 처리중 파일의 LastWriteTime이 다른 경우

 기존에 cocos2d-x용 프로젝트에서 쓸려고 만들었던 패치툴을 유니티3D 게임 프로젝트에 쓸려고 수정중에 있습니다. 예전에는 대충 테스트해서 몰랐는데 지금보니 FileSystemWatcher의 Created 이벤트 발생시 해당 파일의 LastWriteTime 즉, 마시막 수정 날짜가 이상하게 들어오는 증상이 있더군요.


            FileInfo curFileInfo = new FileInfo(strFile);
            FileInfo descFileInfo = new FileInfo(strDescFile);
            if (descFileInfo.Exists == false)
            {
                this.MainForm.AddLog("신규 파일 " + strFileWithoutDir);
                return true;
            }
            else if (curFileInfo.LastWriteTime != descFileInfo.LastWriteTime)
            {
                this.MainForm.AddLog("마지막 쓰기 시간 다름 " + strFileWithoutDir);
                //return true;
            }
            else if (File.GetLastWriteTime(strFile) != File.GetLastWriteTime(strDescFile))
            {
                this.MainForm.AddLog("마지막 쓰기 시간 다름 " + strFileWithoutDir);
                //return true;
            }
            else if (File.Exists(strDescFile) == false)
            {
                this.MainForm.AddLog("신규 파일 " + strFileWithoutDir);
                return true;
            }
            else
            {
                this.MainForm.AddLog(strFileWithoutDir + " 최신 Release 파일과 같은 버전의 파일임.", true);
            }



 대충 파일 위와 같이 수정한 날짜를 얻어오는데요, 혹시나해서 FileInfo와 File.GetLastWriteTime 2가지를 써본 것입니다. 실제 배포버전 툴은 둘중에 하나만 쓰면 되겠죠. 결과를 보면,

  이렇게 LastWriteTime이 다릅니다. 전 같은 놈을 복사 했는데 말이죠. curFileInfo의 것이 Created 이벤트로 얻어온 녀석입니다.

 이렇게 말이죠. 둘은 같은놈입니다.

 이상한 건 꼭 FileSystemWatcher를 통해 가져온 파일 정보만 그렇고 툴 시작전에 미리 PatchFile 같은 디렉터리에 패치파일들을 넣어놓고 툴을 시작해서 인식하면 아무 이상이 없는거죠. 구글링을 해봐도 딱히 답을 찾지 못했는데 일단 아래와 같이 해결했습니다.

using System.Threading;

/// FileSystemWatcher의 Created 이벤트 핸들 함수
void fileWatcher_Created(object sender, FileSystemEventArgs e)
{
...
     Thread.Sleep(100);


}

 Sleep를 줘서 말이죠. 제가 아직 C#을 C++ 처럼 사용하는 수준이라 이렇게 일단 해결은 했네요. C# 버그는 아니겠고, FileSystemWatcher을 제가 잘 못 사용하고 있는건지는...

댓글

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

크로스 스레드 작업이 잘못되었습니다. xxx 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다