我需要完成以下任务:
尝试移动文件。如果文件被锁定,则一旦可用就会立即移动。
我正在使用File.Move,这对我的程序来说已经足够了。现在的问题是:
1)我找不到一个好方法来检查我需要移动的文件是否被锁定。我正在捕捉System.IO.IOException但是阅读其他帖子我发现同样的异常也可能因为不同的原因而抛出。
2)确定文件解锁的时间。执行此操作的一种方法是使用计时器/线程并检查计划的文件,每30秒说一次并尝试移动它们。但我希望有更好的方法使用FileSystemWatcher。
这是一个.net 3.5 winforms应用程序。任何意见/建议表示赞赏。谢谢你的关注。
答案 0 :(得分:4)
您应该尝试捕获IOException。使用Marshal.GetHRForException检查异常的原因。 通知不可靠。另一个进程可能会在执行File.Move之前再次锁定文件。
答案 1 :(得分:2)
很简单:
static void Main(string[] args)
{
//* Create Watcher object.
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\MyFolder\");
//* Assign event handler.
watcher.Created += new FileSystemEventHandler(watcher_Created);
//* Start watching.
watcher.EnableRaisingEvents = true;
Console.ReadLine();
}
static void watcher_Created(object sender, FileSystemEventArgs e)
{
try
{
File.Move(e.FullPath, @"C:\MyMovedFolder\" + e.Name);
}
catch (Exception)
{
//* Something went wrong. You can do additional proceesing here, like fire-up new thread for retry move procedure.
}
}
答案 2 :(得分:1)
一种可能的替代方法是使用带有MOVEFILE_DELAY_UNTIL_REBOOT
标记的MoveFileEx
。如果您现在无权移动文件,则可以安排在下次重新启动时将其移动,以确保可以访问(移动在启动顺序的早期发生)。
根据您的具体应用程序,您可以通知用户必须重新启动,并在移动计划之外自行启动重启。
答案 3 :(得分:1)
这不是特定于您的问题,但通常您将始终需要保留“尝试并优雅地处理失败”操作模式以执行此类操作。
那是因为无论你的'检测到文件是否可用'机制是多么聪明,你在检测到文件可用和移动它之间总会有一段时间,并且在那个时间其他人可能会弄乱文件。
答案 4 :(得分:1)
异常的预定重试(可能增加延迟 - 达到某一点)可能是实现此目的的最简单方法(你的(2))。 要正确地执行它,您将不得不降低到系统级别(使用内核代码)挂钩来捕获文件关闭事件 - 它具有自己的idiosynchrases。这是一项很大的工作 - 比计划的重试方法复杂几个数量级。这取决于你和你的应用案例,但是我不知道它们之间有什么有效的。
答案 5 :(得分:0)
查看FileSystemWatcher。
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(VS.90).aspx
收听文件系统更改 通知和提出事件时 目录,或目录中的文件, 变化