Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#在硬盘上查找具有某些扩展名的文件_C#_File_Find_Hard Drive_Drive - Fatal编程技术网

c#在硬盘上查找具有某些扩展名的文件

c#在硬盘上查找具有某些扩展名的文件,c#,file,find,hard-drive,drive,C#,File,Find,Hard Drive,Drive,我想找到整个硬盘驱动器中的所有文件(.jpg、.png、.apk和其他一些格式),但这段代码不起作用。它所做的只是:例如,如果在我的“D:\”驱动器中,我有:1)一个图像文件“i1”,2)包含图像文件的文件夹“f1”和3)包含图像文件的另一个文件夹“f2”和包含图像文件的文件夹“f3”。它只对f1和f2内的内容执行“calcFile()”,而不对f3和i1的内容执行“calcFile()”。所有其他分区都会执行同样的操作。这里有什么问题?感谢您的帮助。 我希望你能理解发生了什么,因为这是我能解释

我想找到整个硬盘驱动器中的所有文件(.jpg、.png、.apk和其他一些格式),但这段代码不起作用。它所做的只是:例如,如果在我的“D:\”驱动器中,我有:1)一个图像文件“i1”,2)包含图像文件的文件夹“f1”和3)包含图像文件的另一个文件夹“f2”和包含图像文件的文件夹“f3”。它只对f1和f2内的内容执行“calcFile()”,而不对f3和i1的内容执行“calcFile()”。所有其他分区都会执行同样的操作。这里有什么问题?感谢您的帮助。 我希望你能理解发生了什么,因为这是我能解释我的情况的最简单的方法,如果需要更多信息,请告诉我。谢谢:)


只枚举根目录,不枚举子目录。不要使用
目录。GetDirectory
使用

foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))
但是要注意由于子目录中的链接而产生的无限循环(请参阅上的MSDN)


您应该了解用户访问权限。如果您没有特定目录的访问权限,您应该在
GetFiles
部分周围放置一个
try…catch

我根据您的代码创建了一个函数,该函数将递归搜索目录中与您的模式匹配的任何内容。您必须从基本目录的循环中调用它

public static void crawlDirectory(string token,string directory)
    {
        if (string.IsNullOrEmpty(directory)) return;
        var validExtensions = new[]
        {

             ".jpg", ".png", ".apk"

        };

        foreach (string d in Directory.GetDirectories(directory))
        {
            FileAttributes attrs1 = File.GetAttributes(d);
            if (!attrs1.HasFlag(FileAttributes.ReparsePoint) && !attrs1.HasFlag(FileAttributes.System))
            {
                string[] allFilesInDir = Directory.GetFiles(d);
                for (int i = 0; i < allFilesInDir.Length; i++)
                {
                    string file = allFilesInDir[i];
                    string extension = Path.GetExtension(file);
                    if (validExtensions.Contains(extension))
                    {
                        string p = Path.GetFullPath(file);
                        FileAttributes attrs = File.GetAttributes(p);
                        if (attrs.HasFlag(FileAttributes.ReadOnly))
                        {
                            File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
                            calcFile(file, token);
                        }
                        else
                        {
                            calcFile(file, token);
                        }
                    }
                }
            }

            crawlDirectory(d, token);
        }
    }
公共静态目录(字符串令牌,字符串目录)
{
if(string.IsNullOrEmpty(directory))返回;
var VALIDEX=新[]
{
.jpg“,.png“,.apk”
};
foreach(Directory.GetDirectories(Directory)中的字符串d)
{
FileAttributes attrs1=File.GetAttributes(d);
如果(!attrs1.HasFlag(FileAttributes.ReparsePoint)和&!attrs1.HasFlag(FileAttributes.System))
{
字符串[]allFilesInDir=Directory.GetFiles(d);
for(int i=0;i
的可能重复,您可能必须指定一个SearchOption目录.GetFiles(d,SearchOption.AllDirectory),这是不可能的,因为GetFiles的重载不允许这样做…我已经尝试过了,看看您是否也可以使用递归,请查看此。是的,但是如果我添加Directory.GetFiles(d,SearchOption.AllDirectories),这是不可能的,因为GetFiles的重载必须包含(path,searchpattern,SearchOption)我无法仅指定路径和搜索选项..这是我的看法..我是否遗漏了什么?正如您预测的那样,它会给出错误,表示对C\document的访问和设置被拒绝,这是一个重解析点,我猜,所以我怎么能忽略我甚至包括在内的这些文件?请尝试..捕获,我还想排除回收器和系统卷之类的文件信息请参见链接问题。您的是一个副本,现在。感谢您的答复,但它显示calcDirectory(d)上的错误;它表示“非静态字段、方法或属性需要对象引用”,请尝试将其从静态转换为“非”静态。看看这是否有效。此外,您还必须插入此命令来代替当前的目录循环。在研究代码后,我发现最后一次调用calcDirectory(d)是不合适的,因为“d”将是路径,而我的calcDirectory()接受“token”(密码)作为参数哦,伙计,您是100%正确的。那是我的错误。这就是递归要发生的地方。在我发布之前,我做了一个快速的重构,结果搞砸了。该调用应该是对crawlDirectory(d,token)的调用。我在上面做了适当的更改。它解决了我的部分问题。如果你在开始时看我的问题,我提到它直到“i1”(直接位于D:\\eg:D:\\image.jpg中的文件)才到达,但它仍然没有到达。。但是谢谢你的帮助它解决了我大部分的问题。。
foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))
public static void crawlDirectory(string token,string directory)
    {
        if (string.IsNullOrEmpty(directory)) return;
        var validExtensions = new[]
        {

             ".jpg", ".png", ".apk"

        };

        foreach (string d in Directory.GetDirectories(directory))
        {
            FileAttributes attrs1 = File.GetAttributes(d);
            if (!attrs1.HasFlag(FileAttributes.ReparsePoint) && !attrs1.HasFlag(FileAttributes.System))
            {
                string[] allFilesInDir = Directory.GetFiles(d);
                for (int i = 0; i < allFilesInDir.Length; i++)
                {
                    string file = allFilesInDir[i];
                    string extension = Path.GetExtension(file);
                    if (validExtensions.Contains(extension))
                    {
                        string p = Path.GetFullPath(file);
                        FileAttributes attrs = File.GetAttributes(p);
                        if (attrs.HasFlag(FileAttributes.ReadOnly))
                        {
                            File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
                            calcFile(file, token);
                        }
                        else
                        {
                            calcFile(file, token);
                        }
                    }
                }
            }

            crawlDirectory(d, token);
        }
    }