我需要一个程序来检查新文件夹/文件是否已添加到给定的选定文件夹中。 我需要在应用程序启动时运行此过程,因此此阶段的处理时间很重要。
我想我可以制作当前状态的日志,先前状态的日志,对它们进行排序和比较。
首先我需要知道是否还有其他方法。
其次,如果没有其他方法,找到两个文件路径列表之间差异的最佳方法是什么:结构和算法。
旧状态:
c:\firstfolder\a.doc
c:\firstfolder\b.doc
c:\firstfolder\secondFolder\a.doc
c:\firstfolder\secondFolder\b.doc
新状态:
c:\firstfolder\a.doc
c:\firstfolder\b.doc
c:\firstfolder\secondFolder\a.doc
c:\firstfolder\secondFolder\b.doc
c:\firstfolder\secondFolder\c.doc
我正在寻找
c:\firstfolder\secondFolder\c.doc
。
您可以使用 FileSystemWatcher 类,我认为它正在做您想要的事情。
由于您的应用程序不是连续运行的,因此使用 FileSystemWatcher 对您来说似乎不是一个好的选择,但我确实想提及它,因为它可能会激发您的一些想法。
如果您有旧状态的列表并创建新状态的列表,您可以使用类似于此处概述的算法来比较两个列表,以确定自第一个列表创建以来的添加和删除。对所提供的链接的接受答案也有一个很好的解决方案,如果列表未排序,该解决方案效果很好。
您可以保存最后状态的时间信息。然后您就可以将文件和文件夹的创建时间与此进行比较。下面的代码可能会给你一个想法:
foreach(FileInfo f in dir.GetFiles() {
if(f.CreationTime > dtLastState ) {
//do some interesting stuff
}
}
编辑:这不是一个完整的答案。您无法通过此代码获取已删除的文件。
我认为最好的选择是递归目录并保存状态。像这样的东西:
public List<FileData> RecurseDirectory(string directory, int level, out int files, out int folders)
{
IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
//long size = 0;
files = 0;
folders = 0;
WIN32_FIND_DATA findData;
List<FileData> list = new List<FileData>();
IntPtr findHandle;
// add global escape chars if not present.
if (directory.StartsWith(@"\\?\"))
{
findHandle = FindFirstFile(directory + @"\*", out findData);
}
else
{
findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData);
}
if (findHandle != INVALID_HANDLE_VALUE)
{
//if file exists:
do
{
if ((findData.dwFileAttributes & FileAttributes.Directory) != 0)
{
//if it's a directory:
if (findData.cFileName != "." && findData.cFileName != "..")
{
//increment folder counter.
folders++;
int subfiles, subfolders;
string subdirectory = directory + (directory.EndsWith(@"\") ? "" : @"\") +
findData.cFileName;
//Console.WriteLine("Dir:" + subdirectory);
//add it to list
String path = subdirectory;
FileData tempFileData = new FileData();
tempFileData.path = path;
tempFileData.fileProperties = findData;
list.Add(tempFileData);
//allows -1 to do complete search.
if (level != 0)
{
//recurse through to next subfolder
list.AddRange(RecurseDirectory(subdirectory, level - 1, out subfiles, out subfolders));
folders += subfolders;
files += subfiles;
}
}
}
else
{
// File
files++;
string subfile = directory + (directory.EndsWith(@"\") ? "" : @"\") +
findData.cFileName;
//Console.WriteLine("File:" + subfile);
//list.Add("File:" + subfile);
String path = subfile;
FileData t = new FileData();
t.path = path;
t.fileProperties = findData;
list.Add(t);
//size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296L;
}
}
while (FindNextFile(findHandle, out findData));
FindClose(findHandle);
}
return list;
}
此后,您将获得州列表。如果列表中也有旧状态。立即比较列表。
最近我也有和你一样的需求。我目前正在使用 QT 编写这样的程序。请参阅我在 Github 网站上的代码和如何将树文件夹显示到 QT 树视图。