我有一个让我发疯的问题。也许你可以帮忙;)
我正在使用FileSystemWatcher跟踪文件夹上的文件更改,并将更改的文件复制到另一个文件夹。我不想复制文件,直到它被保存完毕。我无法找到适用于以下所有3种情况的解决方案:
1)新文件被复制到文件夹中 2)通过复制新文件覆盖现有文件 3)文件由另一个进程(即Word)打开 我从下面的线程中尝试过IsFileLocked方法。 c# check if file is open
它可以用于复制,但问题是对于打开的OFFICE文件,函数将始终返回TRUE(也可能对于其他一些文件)。
我还尝试在循环中检查文件大小是否发生变化,但似乎不可能,因为FileInfo.Length总是返回目标大小(即使文件仍在被复制)。
我正在使用该功能检查文件是否正在使用
public static bool IsFileLocked(string path)
{
FileInfo fileInfo = new FileInfo(path);
FileStream stream = null;
try
{
stream = fileInfo.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (UnauthorizedAccessException)
{
// file created with readonly flag
return false;
}
catch (FileNotFoundException)
{
return false;
}
catch (IOException ex)
{
int errorCode = Marshal.GetHRForException(ex) & ((1 << 16) - 1);
bool islocked = errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
return islocked;
}
finally
{
if (stream != null)
{
stream.Close();
stream.Dispose();
}
}
//file is not locked
return false;
}
您是否知道如何区分是由某个应用程序打开还是被复制?