在Windows中监视新文件的文件夹

时间:2008-10-28 21:29:56

标签: c++ visual-c++

监控文件夹以查看何时添加图像文件的最佳方法是什么?文件大约每分钟添加一次,命名如下:image0001.jpg,image0002.jpg,image0003.jpg等我需要知道文件何时被写入文件夹,以便我的应用程序可以访问和使用它

8 个答案:

答案 0 :(得分:14)

答案 1 :(得分:4)

如前所述,目录更改通知就是您想要的。

我也调查了它们,我看到的警告是,当文件开始写入文件夹时,Windows将触发通知。如果文件足够大,那么您将在文件写完之前收到通知。

查看this google search以了解等待文件完全写入的各种解决方案

编辑:我刚看到问题是用c ++标记的,我链接到.Net搜索。虽然我提供的内容可能不是正确的语言,但我认为无论您使用何种系统编写,您在Windows上仍会遇到相同的问题。

答案 2 :(得分:1)

FileSystemWatcher应该可以为你做到这一点。

答案 3 :(得分:1)

更改通知可能会导致一些开销,如果你有NTFS,请考虑NTFS change journals

答案 4 :(得分:1)

您可以使用轮询方法来监控文件夹。例如,循环将每5秒执行一次。

此方法返回新文件列表:

List<string> files = new List<string>();
string path = @"C:\test\"; // whatever the path is

public List<string> GetNewFiles(string path)
    {
        // store all the filenames (only .jpg files) in a list
        List<string> currentFiles = System.IO.Directory.GetFiles(path, "*.jpg");

        if ( currentFiles.Count() > files.Count() )
        {
            count = newFiles.Length - files.Length;
            List<string> newFiles = new List<string>();

            foreach ( string file in currentFiles )
            {
                if ( !files.Contains(file) )
                {
                    newFiles.Add(file);
                }
             }
         }
         files = currentFiles;
         return newFiles;
    }

这是每5秒轮询一次并调用前一个方法的方法。

public void MonitorFolder()
{
    while (true)
    {
        List<string> newFiles = GetNewFiles(path);
        System.Threading.Thread.Sleep(5000); // 5000 milliseconds
    }
}

答案 5 :(得分:0)

  1. Synch.variant FindFirstChangeNotification
  2. Asynch.variant ReadDirectoryChangesW

答案 6 :(得分:0)

这是我搜索的最佳Google搜索结果,因此我将其添加为答案。

如果您使用的是Qt,则有QFileSystemWatcher。我不知道这种情况的存在,我们碰巧正在使用Qt,所以我浪费了几个多小时使用FindFirstChangeNotification重写了我可以立即使用的内容,直到同事向我展示了光线。

尽管有很好的学习经验。

答案 7 :(得分:-1)

inotify可能是你的事