winforms 监视文件夹中的新文件并确定文件复制何时完成

fdx2calv  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(182)

我在C# winforms中使用fileSystemWatcher来监视在c:\Backup文件夹中创建的新文件和文件夹,我的客户端将文件传输到此文件夹,我的应用程序应该压缩新创建的文件和文件夹并将其与电子邮件一起发送。
我对Watcher和它的事件没有问题,它工作得很好。
我的问题是我如何知道是否复制大文件到c:\Backup完成,所以我的应用程序可以开始压缩它们并发送它们?
更新:我刚发现每个复制的文件都会先引发Created事件,然后在复制开始时引发Changed事件,复制完成后再次引发Changed事件。

vsaztqbk

vsaztqbk1#

复制完成后,它再次引发Changed事件。
只是要明确在这里,你得到更改通知,每次文件被更改,即当数据完成写入磁盘。这可能发生在每个字节未被缓存时,或者如果缓存了,偶尔只发生一次。高级框架,如。NET实际上有多层缓存,包括操作系统缓存,所以你不知道有多少事件会被触发。
总之,不要以为它总是只有两个事件。它很可能取决于特定应用程序正在编写的文件的大小。唯一可以保证的是,每次看到事件数据时,都表示已完成写入。所以你最好的办法是尝试打开它没有共享(FileSharing.None),如果它失败了,它还没有完成复制。

svgewumm

svgewumm2#

所以在阅读有用的评论和一些变通方法后,我找到了一个解决方案,可能不是最好的方法,但我认为它正在做这项工作。

async private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
    {
        listBox6.Items.Add(e.FullPath + " " + e.ChangeType);

        FileInfo file = new FileInfo(e.FullPath);
        if (file.Attributes != FileAttributes.Directory)
        {

            Action lbl = () => { listBox7.Items.Add(e.Name + " copy in progress"); };

            await Task.Run(() =>
            {

                while (IsFileLocked(file))
                {
                    //some code like progressbar can be here
                    //this.Invoke(lbl);
                }

            }).ConfigureAwait(true);

        }

        listBox7.Items.Add(e.Name + " copied!");

    }

以及检查文件锁的方法(我刚刚从mong zhu的评论中得到的):

bool IsFileLocked(FileInfo file)
    {

        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

相关问题