我有一个由FileSystemWatcher
的服务观看的文件夹,我使用此Answer来帮助我写入大文件。
但是,如果有连续的文件创建(100MB或更多),我就会遇到问题。
问:我该如何解决这个问题?例如,大约10个文件(每个100MB)写入我的文件夹。
注意:此文件夹可通过我的网络访问。可能会创建文件,但不是真正完成/完成。 FileSystemWatcher
可以在不完全写入的情况下处理文件。
检查打开文件是否抛出异常的当前代码
private static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open,
FileAccess.Read, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
当前代码检查是否创建了文件。
private void FSWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
{
var files = getFiles(FSWatcher.Path); //stores all filenames in the directory in a list
if (files.Count() > 0)
{
foreach (string file in files)
{
FileInfo file_info = new FileInfo(file);
while (IsFileLocked(file_info))
{
Thread.Sleep(5000); //Sleep if file unavailable
}
//code to process the file
}
//some code here
}
}
答案 0 :(得分:0)
我过去处理文件夹的方式使用的是轮询,而不是FileSystemWatcher
,its not 100% reliable anyway
我在每个文件中循环处理的处理器,并尝试首先将它们移动到“处理”目录中。移动将(可能*)仅在文件完成写入时才成功,因此一旦移动成功,移动它的线程就可以安全地触发该文件的处理(例如,在新线程中)。请注意,文件只能移动一次,这意味着您不会意外地让两个不同的线程同时尝试处理文件。
*:应用程序可能(但很少见)创建一个可以在其打开时移动的文件