【问题标题】:Get status of the the File or folder copying is complete获取文件或文件夹复制完成的状态
【发布时间】:2024-01-18 16:43:01
【问题描述】:

我打算开发一个文件组织软件,它检测文件到达特殊文件夹并将这些文件复制到特定文件夹(例如 .txt 文件到 Text Doc 文件夹)。我正在使用FileSystemWatcher

用于检测文件。所以我想知道C#代码是否完成了文件或文件夹复制操作(手动复制文件或文件夹)。

单文件程序没问题。但对于多个文件需要改进程序。

我使用这个循环来检查文件是否被释放,但是对于大文件这会导致程序没有响应。

void File_move(string source,string destination)
        {
            EE:
                try
                {
                    File.Move(source, destination);
                }
                catch (Exception ex)
                {
                    lblStatus.Text = "Waiting for file copping complete";
                    Application.DoEvents();
                    goto EE;
                }

        }

【问题讨论】:

  • 无法获取操作的当前运行状态。但是 FileSystemWatcher 应该在创建文件时引发“已创建”事件或其他事件 - 问题是我认为它是在复制刚刚开始并正在运行时创建的。是这个意思吗?
  • 你是对的。它是在复制刚开始时创建的......我google了很多。我不认为会有答案。感谢回复
  • 您可以继续收听 FileSizeChanged 事件或类似的事件(或上次访问日期,即使我也认为它在复制开始时设置了一次)。但是,您需要找出复制停止的时间(可能在一段时间没有 FileSizeChanged 事件之后)。

标签: c# copy detection filesystemwatcher


【解决方案1】:

经过很长时间,我为自己的问题找到了解决方案。这是在 c# 和 vb.net 中获取文件复制进度的链接

http://pinvoke.net/default.aspx/kernel32/CopyFileEx.html

在这个示例代码中,我们可以得到复制文件的进度

private CopyProgressResult CopyProgressHandler(long total, long transferred, long streamSize, long StreamByteTrans, uint dwStreamNumber,CopyProgressCallbackReason reason, IntPtr hSourceFile, IntPtr hDestinationFile, IntPtr lpData)
    {
        Progressbar.Max=Convert.ToInt32(total);
        Progressbar.Value=Convert.ToInt32(transferred);
        Application.Doevents();
        return CopyProgressResult.PROGRESS_CONTINUE;
    }

long total 给出总大小,long transfer 给出当前进度

【讨论】: