C#一旦可用就移动文件

时间:2010-04-27 08:46:44

标签: c# io filesystems

我需要完成以下任务:

尝试移动文件。如果文件被锁定,则一旦可用就会立即移动。

我正在使用File.Move,这对我的程序来说已经足够了。现在的问题是:

1)我找不到一个好方法来检查我需要移动的文件是否被锁定。我正在捕捉System.IO.IOException但是阅读其他帖子我发现同样的异常也可能因为不同的原因而抛出。

2)确定文件解锁的时间。执行此操作的一种方法是使用计时器/线程并检查计划的文件,每30秒说一次并尝试移动它们。但我希望有更好的方法使用FileSystemWatcher。

这是一个.net 3.5 winforms应用程序。任何意见/建议表示赞赏。谢谢你的关注。

6 个答案:

答案 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

  

收听文件系统更改   通知和提出事件时   目录,或目录中的文件,   变化