所以我有function
检查我的File
是否仍在使用中(为了在尝试复制和删除之前等待):
private static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
using (stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
}
}
catch (IOException)
{
// The file is unavailable because it is:
// 1. Still being written to.
// 2. Being processed by another thread.
// 3. Does not exist (has already been processed).
if (stream != null)
stream.Close();
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
所以这足以调用Close()
方法或使用using
来确保在完成我的方法后file
已关闭?
答案 0 :(得分:1)
其他答案和评论已经指出了代码中的冗余以及为什么您当前的方法可能不会很好。我会尝试给你一些如何解决更普遍问题的指导。
我使用的方法如下:
故事的道德:检查文件是否被锁定以便对其执行某些阻止操作是没有意义的,在您执行检查后立即锁定它没有任何阻止。这样做的方法是简单地尝试对文件执行您需要的操作,如果它不起作用,请稍后再试。如果确实如此,嘿,工作完成了,很棒。
(*)如果你做知道文件处理何时完成,那么所有这些都是毫无意义的,在上一步完成时复制和删除。
答案 1 :(得分:0)
我认为你错过了使用声明的重点。具有IDisposible的类可以与using语句一起使用。当using语句结束时,"使用"类自动处理。正确编写的类将关闭所有打开的操作并处理该类。所以,简而言之,只需执行以下操作即可。使用FileAccess和FileShare来满足您的需求。
void t()
{
using (FileStream _fileStream = new FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (StreamReader sr = new StreamReader(_fileStream))
{
// do file operations
}
}
}