File.Move()在C#中自动关闭控制台窗口

时间:2012-06-26 11:01:08

标签: c# file filesystemwatcher

我有一个简单的 C#Console 应用程序,我在其中使用 FileSystemWatcher 并在创建文件时将文件从一个destiantion移动到另一个destiantion。我的代码如下所示:

    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 ,但我不知道如何。我尝试了任务,但这没有帮助。冷杉复制文件然后删除也没有帮助。是什么导致这种情况,我该如何防止这种情况?提前致谢

2 个答案:

答案 0 :(得分:1)

根据经验,使用FileWatcher监视文件,因为它们被转储并且(可能)移动它们比想要管理的文件更麻烦。原因很简单,如果在应用程序关闭时将文件转储到目录中,FileWatcher就不会捕获它们。我更喜欢使用定时轮询的Timer,检查目录中是否有文件并移动它们。使用这种方法,如果在应用程序关闭时(例如维护)将新文件转储到文件夹中,则一旦应用程序重新启动并且计时器开始轮询,它们就会被移动

答案 1 :(得分:0)

不复制两个文件:在复制一个文件时,会创建另一个文件,但会禁用引发事件,因此不会通知您该事件。

尝试扫描File_OnChanged中的目录,然后你会发现它。

为什么退出?我认为它引发了一个异常,可能是写过程没有完成写入而你已经在访问该文件 - 这可能是不被允许的。