AFAIK 파일에 쓰기 표시가 있다는 점을 제외하고는 복사 중임을 나타내는 특별한 표시가 없습니다. 이 상황에서는 쓰기 잠금 (예 : FileShare.Read)을 사용하여 파일을 직접 열고 파일이 이미 잠겨 있기 때문에 발생하는 IOException을 잡으려고 시도하는 것이 일반적입니다. 이 경우 파일을 다시 시도하기 전에 잠시 멈추어야합니다 (Thread.Sleep). 기존 파일 잠금이 해제되지 않을 경우를 대비하여 무한 루프를 방지하기 위해 재시도 횟수를 제한 할 수 있습니다.
파일을 처리하고 삭제 하시겠습니까?
string sourcePath = @"C:\temp1\temp.txt";
string targetPath = @"C:\temp2\temp.txt";
int attempt = 0;
const int maxAttempts = 3;
bool moved = false;
do
{
try
{
File.Move(sourcePath, targetPath);
moved = true;
}
catch (IOException)
{
if (attempt < maxAttempts)
{
System.Threading.Thread.Sleep(1000);
attempt++;
}
}
} while (!moved && attempt < maxAttempts);
if (moved)
{
ProcessFile(targetPath);
File.Delete(targetPath);
}
else
{
throw new InvalidOperationException("Unable to process '" + sourcePath + "'.");
}
편집 : 당신이 그것을/삭제를 처리하는 동안 동일한 파일에 다른 프로세스/스레드 쓰기와 경쟁을 피하기 위해이 같은 원자 예를 들어, 동작, 무언가로 삭제/당신의 처리를 생각한다 : 파일이 매우 커질 수 있으므로 File.ReadAllText를 사용하면 안된다고 생각합니다. 파일을 다른 디렉토리로 이동하려고 시도 할 수 있습니다. 예외가 발생하면 파일이 다른 프로세스에 의해 여전히 잠겨 있습니다. 파일을 성공적으로 이동 한 경우에만 파일을 처리합니다. 이것은 또한 입력 디렉토리에서 파일을 제거하는 이점이 있습니다.
Windows가하는 것입니까, 내가 뭘해야한다고 추천합니까? 필자는 쓰기 과정을 제어 할 수 없습니다. –
"임시 파일 이름으로 파일 쓰기 및 파일 이름 바꾸기"Windows에서이 방법이 작동하도록합니까? 그 공식 문서가 있습니까? 리눅스에서 글쓰기가 끝나기 전에 이름이 바뀔 수 있습니다. – CodesInChaos
이 방법으로 구현할 수 있지만 과정을 작성하는 과정에 액세스해야합니다. –