Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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#_.net_Windows Mobile 6_Compact Framework2.0 - Fatal编程技术网

C# 从目录中删除除文件夹及其';内容

C# 从目录中删除除文件夹及其';内容,c#,.net,windows-mobile-6,compact-framework2.0,C#,.net,Windows Mobile 6,Compact Framework2.0,我正在尝试删除存储卡上的所有文件而不删除其中一个。我可以使用当前代码保留指定的目录,但不能保留其内容。它只剩下空白 文件夹数据,因为它会删除其中的所有内容。如何防止它删除该文件夹及其内容 private void button1_Click(object sender, EventArgs e) { ScanDirectory scanDirectory = new ScanDirectory(); scanDirectory.WalkDirectory(@"/Storage Car

我正在尝试删除存储卡上的所有文件而不删除其中一个。我可以使用当前代码保留指定的目录,但不能保留其内容。它只剩下空白 文件夹数据,因为它会删除其中的所有内容。如何防止它删除该文件夹及其内容

private void button1_Click(object sender, EventArgs e)
{
   ScanDirectory scanDirectory = new ScanDirectory();
   scanDirectory.WalkDirectory(@"/Storage Card");
   scanDirectory.WalkDirectory(@"/Application");
}

public class ScanDirectory
{
   public void WalkDirectory(string directory)
   {
      WalkDirectory(new DirectoryInfo(directory));
   }

   private static void WalkDirectory(DirectoryInfo directory)
   {
      // Scan all files in the current path
      foreach (FileInfo file in directory.GetFiles())
      {
         file.Attributes &= ~FileAttributes.ReadOnly;

         var name = file.Name;
         name = name.ToLower();
         if (name != "test.txt")
         {
            file.Delete();
         }
      }
      DirectoryInfo[] subDirectories = directory.GetDirectories();
      foreach (DirectoryInfo subDirectory in subDirectories)
      {
         WalkDirectory(subDirectory);
         subDirectory.Attributes &= ~FileAttributes.ReadOnly;

         var name = subDirectory.Name;
         name = name.ToLower();
         if (name != "data")
         {
            subDirectory.Delete();
         }
      }
   }
}    

问题在于递归函数调用的方式:主函数
private static void WalkDirectory(DirectoryInfo directory)
删除所有文件,并且每次都被调用(甚至在分析子目录时)。这里有一个修复程序,可以使此代码按您的意愿工作:

   private static void WalkDirectory(DirectoryInfo directory)
   {
       if (directory.Name.ToLower() != "data")
       {
         // Scan all files in the current path
         foreach (FileInfo file in directory.GetFiles())
         {
             file.Attributes &= ~FileAttributes.ReadOnly;

             var name = file.Name;
             name = name.ToLower();
             if (name != "test.txt")
             {
               file.Delete();
             }
         }

         DirectoryInfo[] subDirectories = directory.GetDirectories();
         foreach (DirectoryInfo subDirectory in subDirectories)
         {
            WalkDirectory(subDirectory);
            subDirectory.Attributes &= ~FileAttributes.ReadOnly;

            var name = subDirectory.Name;
            name = name.ToLower();
            if (name != "data")
            {
               subDirectory.Delete();
            }
         }
      }
   }

我不知道如何使用您当前的代码成功删除名为
test.txt的文件。如果您将遍历的每个文件都写入控制台,那么该文件真的会出现吗?它工作正常。我不会删除text.txt或名为data的文件夹,只需确认设置一个断点并查看“name”变量是什么。我有点困惑-您想保留哪个文件夹?根据您的代码,您的意思是不会删除任何名为test.txt的文件以及顶级命名数据下的任何文件夹(只要目录为空)。这几乎是正确的。我试图保留顶级数据文件夹及其内容。到目前为止,它正在删除它的内容。它保留数据文件夹并删除其中的所有内容。非常感谢,您能再次以正确的方式帮助调用它吗?如果不是的话,我最终会找到答案的。这个修正正是为了让它尽可能地工作(只需替换函数,让其余的代码保持原样)。当递归调用函数时,必须确保它考虑了所有可能的情况。这里有两种可能的情况:主目录和子目录;但是您原来的函数只是解释了主要场景(=删除所有文件和所有子目录)。因此,与其正确地调用它,还不如让它正确地处理所有需要处理的事情(或使用不同的功能)。没问题。如果您的代码现在正常工作,请将此答案标记为正确答案。确定新问题,如何防止它删除数据文件夹中的任何子文件夹?它不会删除数据文件夹中的文件,但会删除子文件夹?啊!很抱歉。我更新了我的答案。除非主方向被称为“数据”,否则这将起作用。如果您想考虑任何情况(即使主目录被称为“数据”),您必须更改函数并包含进一步的参数来判断这是否是第一次迭代(上层)。
private static void WalkDirectory(DirectoryInfo directory)
   {
       if (directory.Name.ToLower() != "data")
       {
         // Scan all files in the current path
         foreach (FileInfo file in directory.GetFiles())
         {
             file.Attributes &= ~FileAttributes.ReadOnly;

             var name = file.Name;
             name = name.ToLower();
             if (name != "test.txt")
             {
               file.Delete();
             }
         }

         DirectoryInfo[] subDirectories = directory.GetDirectories();
         foreach (DirectoryInfo subDirectory in subDirectories)
         {
            WalkDirectory(subDirectory);
            subDirectory.Attributes &= ~FileAttributes.ReadOnly;

            var name = subDirectory.Name;
            name = name.ToLower();
            if (name != "data")
            {
               subDirectory.Delete();
            }
         }
      }
   }