C# 删除文件的正确方法&;目录在内部,但不使用目录路径?

C# 删除文件的正确方法&;目录在内部,但不使用目录路径?,c#,C#,在下面的脚本中,我希望保留“Dominion”文件夹,而不删除它。问题是这个目录。Delete命令删除“Dominion”文件夹 只要用这个: var directoryPath = @"X:\Applications\Dealer\Data\Ftp\Incoming"; System.IO.DirectoryInfo directoryToClean = new DirectoryInfo(directoryPath ); foreach (FileInfo file in director

在下面的脚本中,我希望保留“Dominion”文件夹,而不删除它。问题是这个
目录。Delete
命令删除“Dominion”文件夹

只要用这个:

var directoryPath = @"X:\Applications\Dealer\Data\Ftp\Incoming";
System.IO.DirectoryInfo directoryToClean = new DirectoryInfo(directoryPath );

foreach (FileInfo file in directoryToClean.GetFiles())
{
    file.Delete(); 
}
foreach (DirectoryInfo dir in directoryToClean.GetDirectories().Where(dir => dir.Name != "Dominion"))
{
    dir.Delete(true);
}
只要用这个:

var directoryPath = @"X:\Applications\Dealer\Data\Ftp\Incoming";
System.IO.DirectoryInfo directoryToClean = new DirectoryInfo(directoryPath );

foreach (FileInfo file in directoryToClean.GetFiles())
{
    file.Delete(); 
}
foreach (DirectoryInfo dir in directoryToClean.GetDirectories().Where(dir => dir.Name != "Dominion"))
{
    dir.Delete(true);
}

您可能会将其简化为委托,但获取文件并循环遍历它们非常简单

var directoryPath = "X:\Applications\Dealer\Data\Ftp\Incoming";

if (Directory.Exists(directoryPath + @"\" + "Dominion"))  
{
    var newPath = directoryPath + @"\" + "Dominion";
    var files = Directory.GetAllFiles(newPath);

    foreach (var file in files)
    {
        File.Delete(file);
    }
}

您可能会将其简化为委托,但获取文件并循环遍历它们非常简单

var directoryPath = "X:\Applications\Dealer\Data\Ftp\Incoming";

if (Directory.Exists(directoryPath + @"\" + "Dominion"))  
{
    var newPath = directoryPath + @"\" + "Dominion";
    var files = Directory.GetAllFiles(newPath);

    foreach (var file in files)
    {
        File.Delete(file);
    }
}

您可以使用这种方法:

var root = new DirectoryInfo(@"X:\Applications\Dealer\Data\Ftp\Incoming");
var deleteableEntries = root.EnumerateFileSystemInfos()
    .Where(entry => (entry.Attributes & FileAttributes.Directory) != FileAttributes.Directory || entry.Name != "Dominion");
foreach(var entryToDelete in deleteableEntries)
    entryToDelete.Delete();
由于多种原因(拒绝访问或文件夹不为空),这将失败,因此这里有一种未经测试的方法,它应该可以工作,或者至少给出一个想法:

var stack = new Stack<FileSystemInfo>(deleteableEntries); // "recursive", stack to delete deepest folders first

while (stack.Count > 0)
{
    FileSystemInfo fsi = stack.Peek();  // don't remove yet, only if it was deleted
    bool isDirectory = (fsi.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
    fsi.Attributes = FileAttributes.Normal; // can avoid possible access-denied exceptions if it's readonly
    try
    {
        bool canBeDeleted = !isDirectory;
        if (isDirectory)
        {
            var subEntries = new DirectoryInfo(fsi.FullName).EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories);
            canBeDeleted = !subEntries.Any();
            foreach (FileSystemInfo subEntry in subEntries)
                stack.Push(subEntry);
        }
        if (canBeDeleted)
        {
            fsi.Delete();
            stack.Pop(); // remove it
        }
    } catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
}
var stack=新堆栈(deletableentries);//“递归”,堆栈先删除最深的文件夹
而(stack.Count>0)
{
FileSystemInfo fsi=stack.Peek();//仅当它已被删除时才删除
bool isDirectory=(fsi.Attributes&FileAttributes.Directory)=FileAttributes.Directory;
fsi.Attributes=FileAttributes.Normal;//如果是只读的,则可以避免可能的拒绝访问异常
尝试
{
bool canBeDeleted=!isDirectory;
国际单项体育联合会(isDirectory)
{
var subEntries=newdirectoryinfo(fsi.FullName).EnumerateFileSystemInfos(“**”,SearchOption.AllDirectories);
canBeDeleted=!subEntries.Any();
foreach(子项中的FileSystemInfo子项)
stack.Push(子项);
}
如果(可以删除)
{
fsi.Delete();
stack.Pop();//删除它
}
}捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
}

您可以使用以下方法:

var root = new DirectoryInfo(@"X:\Applications\Dealer\Data\Ftp\Incoming");
var deleteableEntries = root.EnumerateFileSystemInfos()
    .Where(entry => (entry.Attributes & FileAttributes.Directory) != FileAttributes.Directory || entry.Name != "Dominion");
foreach(var entryToDelete in deleteableEntries)
    entryToDelete.Delete();
由于多种原因(拒绝访问或文件夹不为空),这将失败,因此这里有一种未经测试的方法,它应该可以工作,或者至少给出一个想法:

var stack = new Stack<FileSystemInfo>(deleteableEntries); // "recursive", stack to delete deepest folders first

while (stack.Count > 0)
{
    FileSystemInfo fsi = stack.Peek();  // don't remove yet, only if it was deleted
    bool isDirectory = (fsi.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
    fsi.Attributes = FileAttributes.Normal; // can avoid possible access-denied exceptions if it's readonly
    try
    {
        bool canBeDeleted = !isDirectory;
        if (isDirectory)
        {
            var subEntries = new DirectoryInfo(fsi.FullName).EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories);
            canBeDeleted = !subEntries.Any();
            foreach (FileSystemInfo subEntry in subEntries)
                stack.Push(subEntry);
        }
        if (canBeDeleted)
        {
            fsi.Delete();
            stack.Pop(); // remove it
        }
    } catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
    }
}
var stack=新堆栈(deletableentries);//“递归”,堆栈先删除最深的文件夹
而(stack.Count>0)
{
FileSystemInfo fsi=stack.Peek();//仅当它已被删除时才删除
bool isDirectory=(fsi.Attributes&FileAttributes.Directory)=FileAttributes.Directory;
fsi.Attributes=FileAttributes.Normal;//如果是只读的,则可以避免可能的拒绝访问异常
尝试
{
bool canBeDeleted=!isDirectory;
国际单项体育联合会(isDirectory)
{
var subEntries=newdirectoryinfo(fsi.FullName).EnumerateFileSystemInfos(“**”,SearchOption.AllDirectories);
canBeDeleted=!subEntries.Any();
foreach(子项中的FileSystemInfo子项)
stack.Push(子项);
}
如果(可以删除)
{
fsi.Delete();
stack.Pop();//删除它
}
}捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
}

枚举根目录中的所有文件和目录并将其删除。枚举根目录中的所有文件和目录并将其删除。如果一个文件名为Dominion,该怎么办?@Thomas:这一点很好,让它变得有点复杂。但我更关心的不是空目录。我必须重新考虑。空目录将与其内容一起删除,不是吗?@Thomas:是的,但非空目录将导致异常,添加了另一种方法。如果文件名为Dominion,该怎么办?@Thomas:说得好,这会使它更复杂一点。但我更关心的不是空目录。我必须重新考虑。空目录将与其内容一起删除,不是吗?@Thomas:是的,但非空目录将导致异常,另一种方法补充道