C# 删除目录中的所有内容,C中的文件除外#

C# 删除目录中的所有内容,C中的文件除外#,c#,file,delete-file,C#,File,Delete File,删除目录中除文件(index.dat)以外的所有内容时遇到问题 我试图清除cookies文件夹和临时文件夹中的文件,但在尝试删除index.dat时出错,因为它正被另一个进程使用。有没有办法删除temp和cookies文件夹中除index.dat文件之外的所有内容?这是我的密码: string userProfile = Environment.GetEnvironmentVariable("USERPROFILE"); string strDirLocalq = Path.Combine(us

删除目录中除文件(index.dat)以外的所有内容时遇到问题 我试图清除cookies文件夹和临时文件夹中的文件,但在尝试删除index.dat时出错,因为它正被另一个进程使用。有没有办法删除temp和cookies文件夹中除index.dat文件之外的所有内容?这是我的密码:

string userProfile = Environment.GetEnvironmentVariable("USERPROFILE");
string strDirLocalq = Path.Combine(userProfile, "AppData");
string strDirLocalw = Path.Combine(strDirLocalq, "Roaming");
string strDirLocale = Path.Combine(strDirLocalw, "Microsoft");
string strDirLocalr = Path.Combine(strDirLocale, "Windows");
string strDirLocalt = Path.Combine(strDirLocalr, "Cookies");

string[] filePaths = Directory.GetFiles(strDirLocalt);
foreach (string filePath in filePaths)
    File.Delete(filePath);

只需从列表中筛选即可

foreach (string filePath in filePaths.Where(!filePath.Contains("index.dat"))
    File.Delete(filePath);

只需在文件周围放置一个try/catch.Delete,因为可能有更多文件正在使用,这也会引发异常

try
{
  File.Delete(filePath);
}
catch (Exception ignore)
{
}
这项工作:

string[] filePaths = Directory.GetFiles(strDirLocalt);
foreach (string filePath in filePaths)
{
    var name = new FileInfo(filePath).Name;
    name = name.ToLower();
    if (name != "index.dat")
    {
        File.Delete(filePath);
    }
}

为什么不捕获异常呢?当您试图删除这些文件时,它们中的任何一个都可能正在使用

try{
     // delete
}
catch{
}

看看这个有趣的解决方案

List<string> files = new List<string>(System.IO.Directory.GetFiles(strDirLocalt));
files.ForEach(x => { try { System.IO.File.Delete(x); } catch { } });
List files=新列表(System.IO.Directory.GetFiles(strdirlocal));
ForEach(x=>{try{System.IO.File.Delete(x);}catch{});

感受语言的美

一种可能仍然有效的方法是在安全模式下启动,然后为自己分配管理员权限,然后查看是否可以找到要删除的文件


我现在使用的方法是创建一个批处理文件,以重命名包含index.bat文件的文件夹下的子文件夹,然后仅将文件夹复制回不包含这些文件的原始位置,但生成的批处理文件需要从具有完全管理员权限的单独windows帐户运行。

一种递归方法,删除目录中的所有文件,但不包括提供的文件名列表:

public static void DeleteAllExcept(string folderPath, List<string> except, bool recursive = true)
{
    var dir = new DirectoryInfo(folderPath);

    //Delete files excluding the list of file names
    foreach (var fi in dir.GetFiles().Where(n => !except.Contains(n.Name)))
    {
        fi.Delete();
    }

    //Loop sub directories if recursive == true
    if (recursive)
    {
        foreach (var di in dir.GetDirectories())
        {
            DeleteAllExcept(di.FullName, except, recursive);
        }
    }
}

因此,文件
test2.txt
test3.txt
banner.png
temp.jpg
sheet.xls
将被删除。

您可以将
文件.Delete()
放在try/catch块中,以处理无法删除的文件,而不会中断循环(如果您这样选择的话)。如果您想更一般地应用这一点,修改要跳过的文件列表将是一件痛苦的事情。如果要使用where not样式,将来可以将所有跳过的文件放入一个静态数组,然后使用
filepath.where(fp=>!skipped.Any(s=>fp.Contains))
,这很好。无论如何,您仍然需要遍历文件,因此我将结合两种解决方案:tster和Hams’s you's welcome:-)我稍微修改了它以使用FileInfo类。而不是
目录.GetFiles(strDirlocal)
使用
新目录信息(strDirlocal).GetFiles()
返回
列表
,然后您就可以执行
fi.Delete();这也有效。谢谢它也会抓取当前“正在使用”的任何文件,并阻止其被删除
public static void DeleteAllExcept(string folderPath, List<string> except, bool recursive = true)
{
    var dir = new DirectoryInfo(folderPath);

    //Delete files excluding the list of file names
    foreach (var fi in dir.GetFiles().Where(n => !except.Contains(n.Name)))
    {
        fi.Delete();
    }

    //Loop sub directories if recursive == true
    if (recursive)
    {
        foreach (var di in dir.GetDirectories())
        {
            DeleteAllExcept(di.FullName, except, recursive);
        }
    }
}
string myDir = @"C:\TestDirectory"
List<string> keepFiles = new List<string>();

keepFiles.Add("test.txt");
keepFiles.Add("picture.png");
keepFiles.Add("file.pdf");

DeleteAllExcept(myDir, keepFiles, true);
-\
-\test.txt
-\test2.txt
-\test3.txt
-\img\
-\img\picture.png
-\img\banner.png
-\img\temp.jpg
-\files\
-\files\sheet.xls
-\files\file.pdf