C# 从包含的文件夹中删除文件

C# 从包含的文件夹中删除文件,c#,.net,C#,.net,我希望创建一个方法,当文件名包含通配符参数时,可以使用该方法从目录中删除文件 到目前为止,我有以下内容,但我似乎无法确定如何从fileEntries集合中删除包含通配符的任何文件 public static void DeleteFileContaining(string targetDirectory, string wildcard) { // Process the list of ALL files found in the directory.

我希望创建一个方法,当文件名包含通配符参数时,可以使用该方法从目录中删除文件

到目前为止,我有以下内容,但我似乎无法确定如何从fileEntries集合中删除包含通配符的任何文件

public static void DeleteFileContaining(string targetDirectory, string wildcard)
        {
            // Process the list of ALL files found in the directory. 
            string[] fileEntries = Directory.GetFiles(targetDirectory);

            foreach (var item in fileEntries)
            {               
                var itemToDelete = fileEntries.Contains(wildcard);
                 // delete where contains                
            }
        }

任何人都可以通过一次使用目录和通配符的简洁方法调用来完成此任务,或者建议一种更有效的方法来完成此任务吗?

您可以使用
GetFiles
/
EnumerateFiles
的搜索模式(这可能更有效):


查看该部分了解更多信息。

您可以使用
GetFiles
/
EnumerateFiles
的搜索模式(这可能更有效):


查看该部分了解更多信息。

我将使用通配符仅获取我感兴趣的文件

public static void DeleteFileContaining(string targetDirectory, string wildcard){
        string[] fileEntries = Directory.GetFiles(targetDirectory, wildcard);//something like *.jpg

        // delete all matching files. 
        foreach (string f in fileEntries)
        {
            File.Delete(f);
        }
}

我会使用通配符只获取我感兴趣的文件

public static void DeleteFileContaining(string targetDirectory, string wildcard){
        string[] fileEntries = Directory.GetFiles(targetDirectory, wildcard);//something like *.jpg

        // delete all matching files. 
        foreach (string f in fileEntries)
        {
            File.Delete(f);
        }
}

您可能需要查看System.IO-Class以删除文件()

您可能需要查看System.IO-Class以删除文件()

首先,这一行是错误的:

var itemToDelete = fileEntries.Contains(wildcard);
这将返回一个布尔值,指示是否至少有一个文件名完全匹配。你想要的是:

var items = fileEntries.Where(name => name.Contains(wildcard));
第二,你甚至不需要像这样过滤文件名,你可以简单地使用另一个采用搜索模式的文件名


最后,您可以使用来实际删除这些文件。

首先,这一行是错误的:

var itemToDelete = fileEntries.Contains(wildcard);
这将返回一个布尔值,指示是否至少有一个文件名完全匹配。你想要的是:

var items = fileEntries.Where(name => name.Contains(wildcard));
第二,你甚至不需要像这样过滤文件名,你可以简单地使用另一个采用搜索模式的文件名


最后,您可以使用来实际删除这些文件。

我不确定您是否要从文件夹中删除,但正如您所提到的,您希望从fileEntries集合中删除这些文件,您可以通过此操作来实现

fileEntries = fileEntries.Where(a => !a.Contains(wildcard)).ToArray();

我不确定您是否想从文件夹中删除,但正如您所提到的,您想从fileEntries集合中删除,您可以通过以下方式实现

fileEntries = fileEntries.Where(a => !a.Contains(wildcard)).ToArray();

这是我在LINQ身上第一次尝试类似的东西,但这对我来说很有效:

public static void DeleteFileContaining(string targetDirectory, string wildcard)
{
    Directory.GetFiles(targetDirectory).Where(j => j.Contains(wildcard)).ToList().ForEach(i => File.Delete(i));
}
或者使用多行lambda表达式包含错误处理:

public static void DeleteFileContaining(string targetDirectory, string wildcard)
{
    Directory.GetFiles(targetDirectory).Where(j => j.Contains(wildcard)).ToList().ForEach(i =>
        {
            try
            {
                File.Delete(i);
            }
            catch (Exception ex)
            {                        
                //do something here on exception.
            }
        });
}

这是我在LINQ身上第一次尝试类似的东西,但这对我来说很有效:

public static void DeleteFileContaining(string targetDirectory, string wildcard)
{
    Directory.GetFiles(targetDirectory).Where(j => j.Contains(wildcard)).ToList().ForEach(i => File.Delete(i));
}
或者使用多行lambda表达式包含错误处理:

public static void DeleteFileContaining(string targetDirectory, string wildcard)
{
    Directory.GetFiles(targetDirectory).Where(j => j.Contains(wildcard)).ToList().ForEach(i =>
        {
            try
            {
                File.Delete(i);
            }
            catch (Exception ex)
            {                        
                //do something here on exception.
            }
        });
}


为什么不使用Directory.GetFiles(Directory,pattern)?为什么不使用Directory.GetFiles(Directory,pattern)?哇,这是对林克的一种可怕的虐待。@DanielKelley--请详细说明。认真地我是LINQ的“新手”。LINQ是一个查询工具。上面的代码会产生副作用,这是不可取的。在您使用
ForEach
删除文件之前,您的代码基本上是正常的。然后,您应该使用常规的
foreach
循环来迭代并删除它们。@DanielKelley在产生副作用时,他不再使用LINQ,只使用常规的
List
方法。我不认为这是一种“滥用”,它只是一种更实用的表达意图的方式,而不是以命令式的方式。我的意思是,我知道我在这里扮演魔鬼代言人的角色,因为我完全支持减少代码气味等,但有时你不得不想,在提高代码效率方面需要付出多大的努力。我想这取决于具体情况。哇,这是对林克的一种可怕的滥用。@DanielKelley--请详细说明。认真地我是LINQ的“新手”。LINQ是一个查询工具。上面的代码会产生副作用,这是不可取的。在您使用
ForEach
删除文件之前,您的代码基本上是正常的。然后,您应该使用常规的
foreach
循环来迭代并删除它们。@DanielKelley在产生副作用时,他不再使用LINQ,只使用常规的
List
方法。我不认为这是一种“滥用”,它只是一种更实用的表达意图的方式,而不是以命令式的方式。我的意思是,我知道我在这里扮演魔鬼代言人的角色,因为我完全支持减少代码气味等,但有时你不得不想,在提高代码效率方面需要付出多大的努力。这取决于情况,我认为。这并没有解决OP的问题,不是如何删除,而是如何在需要时高效地删除。这并没有解决OP的问题,不是如何删除,而是如何仅在需要时高效地删除。我遵循了您的建议,但是我的方法不是删除名称为:public static void DeleteFileContaining(string targetDirectory,string wildcard)的requestId的文件{//处理在目录中找到的所有文件的列表。string[]fileEntries=directory.GetFiles(targetDirectory,@wildcard”);foreach(fileEntries中的var项){File.Delete(item);}我遵循了您的建议,但是我的方法不是删除requestId为public static void DeleteFileContaining(string targetDirectory,string wildcard){//处理目录中找到的所有文件的列表。string[]fileEntries=directory.GetFiles(targetDirectory,“@wildcard”);foreach(fileEntries中的var项){File.Delete(项);}我确实想从文件夹中删除,我暂时将每个付款对象存储在文件系统中,然后仅在付款过程成功后删除它们。@选择Distinct OK,然后您可以使用
文件。delete
功能。无论如何,您已经得到了答案。祝您好运!:)我确实想从文件夹中删除,我正在存储ev临时删除文件系统上的付款对象,然后仅在