当前位置: 首页 > 编程语言 > C#

检查文件夹是否包含文件共享

时间:2023-04-10 17:30:32 C#

检查文件夹是否包含文件我有程序要写入数据库文件夹已满或为空。现在我正在使用boolhasFiles=false;(Directory.GetFiles(路径)。长度>0)?有文件=真:有文件=假;但这需要将近一个小时,我现在什么也做不了。有没有最快的方法来检查文件夹是否有任何文件?加快这种跨网络搜索的关键是减少网络上的请求数量。不要获取所有目录,然后检查每个目录,而是尝试一次调用获取所有内容。在.NET3.5中,没有一种方法可以递归地获取所有文件和文件夹,因此您必须自己构建它(见下文)。在.NET4中,新的重载可以一步实现。使用DirectoryInfo还可以获取返回的名称是文件还是目录的信息,这样也减少了调用。这个意思着拆所有目录和文件的列表就像这样:structAllDirectories{publicListDirectoriesWithoutFiles{get;放;}publicListDirectoriesWithFiles{get;放;}}staticclassFileSystemScanner{publicAllDirectoriesDivideDirectories(stringstartingPath){varstartingDir=newDirectoryInfo(startingPath);//allContentIListvarallContent=GetAllFileSystemObjects(startingDir);varallFiles=allContent.Where(f=>!(f.Attributes&FileAttributes.Directory)).Cast();vardirs=allContent.Where(f=>(f.Attributes&FileAttributes.Directory)).Cast();varallDirs=newSortedList(dirs,newFileSystemInfoComparer());varres=newAllDirectories{DirectoriesWithFiles=newList()};foreach(所有文件中的var文件){vardirName=Path.GetDirectoryName(file.Name);if(allDirs.Remove(dirName)){//已删除,所以第一次看到此目录名称。res.DirectoriesWithFiles.Add(dirName);}}//allDirs现在只包含没有文件的目录res.DirectoriesWithoutFiles=newList(addDirs.Select(d=>d.Name));}classFileSystemInfoComparer:IComparer{publicintCompare(FileSystemInfol,FileSystemInfor){returnString.Compare(l.Name,r.Name,StringComparison.OrdinalIgnoreCase);}}}实现GetAllFileSystemObjects取决于.NET版本在.NET4上非常简单:}在早期版本中,仍然需要一些工作:ILIstGetAllFileSystemObjects(DirectoryInforoot){varres=newList();varpending=newQueue(new[]{root});while(pending.Count>0){vardir=pending.Dequeue();varcontent=dir.GetFileSystemInfos();res.AddRange(内容);foreach(vardirincontent.Where(f=>(f.Attributes&FileAttributes.Directory)).Cast()){pending.Enqueue(dir);}}返回资源;此方法尽可能少地调用文件系统,一次在.NET4上,在早期版本上每个目录一次,允许网络客户端和服务器最小化底层文件系统调用和网络往返。获取FileSystemInfo实例的缺点是需要多个文件系统操作(我相信这在某种程度上取决于操作系统),但对于每个名称,任何解决方案都需要知道它是文件还是目录,所以在某种程度上这是不可避免的(不需要求助于P/FindFileFirst/FindNextFile/FindClose的调用)。除此之外,使用分区扩展方法会更容易:Tuple,IEnumerable>Extensions.Partition(thisIEnumerableinput,Funcparition);写出惰性将是一个有趣的练习(只有当某些东西在一个输出上迭代时才会消耗输入同时缓冲另一个输出)。要检查目录或子目录中是否存在任何文件,请使用.net4中的以下方法:publicboolisDirectoryContainFiles(stringpath){if(!Directory.Exists(path))returnfalse;返回Directory.EnumerateFiles(path,"*",SearchOption.AllDirectories).Any();如果您使用.Net4.0,请查看EnumerateFiles方法。http://msdn.microsoft.com/en-us/library/dd413232(v=VS.100).aspxEnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,您可以在返回整个集合之前开始枚举FileInfo对象的集合;使用GetFiles时,必须等待返回整个FileInfo对象数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles会更有效率。通过这种方式,并非所有文件都从文件夹中检索出来,如果枚举器至少有1个文件,那么我假设该文件夹不为空(虽然我不确定)因为您在网络驱动器上调用GetFiles(),它会添加一个很多时间从所有30k文件夹中检索所有文件并枚举它们。我在CodeProject上找到了另一个看起来很有前途的目录枚举器。或者...您可以在服务器上创建一个WebService,它为您枚举所有内容并随后返回结果。编辑:我认为您的问题更有可能是文件夹访问。每次访问网络驱动器中的目录时,都会进行安全和权限检查。*30k文件夹将对性能造成巨大影响。我非常怀疑使用FindFirstFile会有多大帮助,因为枚举的实际文件数仅为0或1。可能值得一提:但这需要将近一个小时,而且我现在无能为力。(重点添加)您是从主线程上的GUI应用程序执行此操作吗?如果是这样,请使用BackgroundWorker关闭此进程。至少,应用程序将继续响应。您还可以向该方法添加一个CancellationPending检查,如果它花费的时间太长则将其取消。与您的问题相关-只是我注意到并认为我会发表评论的事情。最好的方法是使用API函数FindFirstFile。不会花那么长时间。以上是C#学习教程:检查文件夹是否包含文件共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: