CSharp2012.03.09 10:56




윈도우 OS에는 파일의 생성,변경,삭제에 대해서 이벤트를 수신자에게 전달하는 기능이 있습니다. 이중에서 C#에서는 FileSystemWatcher 기능으로 파일의 변경을 감지할 수 있습니다.
 
Case 1:
 1. 기존파일 삭제(Delete Event)
 2. 신규파일 생성(Create Event)
 
기존에 있는 파일의 내용을 변경하여 새로운 내용으로 변경할 때 일반적으로는 다음과 같은 절차로 변경합니다.
 그러나 우리가 원하는 이벤트는 Change 이벤트 1개만 발생하기를 원합니다.
 
Case 2:
 

FileStream fs = null;
StreamWriter sw = null;

fs = new FileStream(txtFileName.Text, FileMode.Open, FileAccess.Write, FileShare.None);
sw = new StreamWriter(fs, System.Text.Encoding.Default);
sw.BaseStream.Seek(0, SeekOrigin.Begin);
sw.Write(txtOutput.Text);

sw.Flush();
sw.Close();
fs.Close();

 이 경우는 기존파일 100bytes 의 문서이고 변경 내용이 90bytes 인 경우 10bytes 의 쓰레기가 남습니다.
 
Case 3:
 System.IO.Copy,  System.IO.Move 의 사용은 원하지 않는 추가 Change 이벤트가 발생합니다.
 
Case 4:
 마지막 방법은 Dos 의 내장 명령어인 move를 사용하여 업데이트를 하는 방법입니다.
이 경우에 특별한 조건을 만족하면 우리가 원하는 1개의 Change 이벤트만을 발생시킵니다.
 1) 변경할려고 하는 하는 내용을 포함한 파일을 생성합니다.
 -. 변경대상 파일과 이름을 동일하게 합니다.
 -. 변경대상 파일과 같은 Root 디렉토리에 저장합니다. (C:\, D:\....)
 2) Dos 명령어를 사용해서 이동합니다.
 예)  cmd /c move D:\Test1\Test.xml   D:\Test2\Test.xml


그러면 Case 4의 경우를 C#으로 구현해 보겠습니다. C#에서 Dos 내장 명령어의 실행은 cmd.exe 명령어의 파라미터를 통해서 실행합니다.


string strTempFileName = @"C:\Temp\Test1\Test.xml";
string strTempFileName = Path.Combine(strTempFolder, txtFileName.Text);

FileStream fs = null;
StreamWriter sw = null;
fs = new FileStream(strTempFileName, FileMode.Create, FileAccess.Write, FileShare.None);
sw = new StreamWriter(fs, System.Text.Encoding.Default);
sw.Write(txtOutput.Text);

sw.Flush();
sw.Close();
fs.Close();

try
{
 System.Diagnostics.Process p = new System.Diagnostics.Process();
 p.StartInfo = new System.Diagnostics.ProcessStartInfo();
 p.StartInfo.FileName = "cmd.exe";
 p.StartInfo.Arguments = String.Format(@"/c move {0} {1}", strTempFileName, txtFileName.Text);
 p.StartInfo.CreateNoWindow = true;
 p.StartInfo.ErrorDialog = false;
 p.StartInfo.RedirectStandardInput = true;
 p.StartInfo.UseShellExecute = false;
 p.Start(); 
}
catch (Exception ex)
{
 txtStatus.AppendText(ex.Message + Environment.NewLine);
}
신고




Posted by 금붕어70