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