2012-06-26 179 views
0

我有,我用FileSystemWatcher的和移动文件从一个destiantion到另一个被创建时就简单C#控制台应用。我的代码如下所示:File.Move()会自动关闭控制台窗口在C#

public static void WatchForFiles() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     //folder path is path to folder 
     watcher.Path = folderPath; 

     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 

     //Add event handlers   
     watcher.Created += new FileSystemEventHandler(File_OnChanged);   

     //Begin watching 
     watcher.EnableRaisingEvents = true; 
    } 


    public static void File_OnChanged(object sender, FileSystemEventArgs e) 
    { 
     //destiantion path is path to folder 
     string destiantionFileFullPath = destianationPath + e.Name; 
     if (!File.Exists(destiantionFileFullPath)) 
     { 
      File.Move(e.FullPath, destiantionFileFullPath); 
     } 
    } 

当我第一次复制文件时,它正常移动。但之后或者如果我复制两个或多个文件,我的控制台窗口会自动关闭。我想我应该使用IAsyncResult但我不知道如何。我试过任务但这并没有帮助。冷杉复制文件,然后删除也没有帮助。这是什么原因造成的?我怎样才能防止这种情况?在此先感谢

+0

听起来像是你有一个异常的地方抛出。创建一个bat文件,在其中调用窗口控制台程序,然后暂停。 – GETah

+1

从内存中我相信FileWatcher可能会在文件完全写入磁盘之前通知您一个新文件(因此您可能试图移动一个仍然被锁定以便写入的文件)。在File.Move和WriteLine中添加一个try {} catch块,这是控制台的例外情况 - 这可能会帮助您解决问题的底部。 – KazR

+0

当我使用try catch时,一切正常,没有异常抛出,这很奇怪 –

回答

1

从经验来看,使用FileWatcher的监测文件,因为它们被转储和(可能的)移动它们比人会希望管理更多的麻烦。简单的原因是,如果在应用程序关闭时将文件转储到目录中,FileWatcher不会捕获它们。我更喜欢使用定期轮询的Timer,检查目录中是否存在文件并移动它们。使用这种方法,如果有新的文件夹中倾倒当应用程序下来(比如用于维护),他们会尽快将应用程序重新启动移动和计时器开始投票

+0

谢谢你的作品更好。 –

0

不复制两个文件:当您复制一个文件时,另一个文件被创建但提高事件被禁用,因此您不会通知事件。

尝试扫描目录File_OnChanged,然后你会看到这个。

它为什么退出?我认为它引发了一个异常,可能写入过程尚未完成写入,并且您已经访问该文件 - 这可能是不允许的。

+0

谢谢你的时间@Mario Th勺 –

相关问题