1

ストレージ カード上のファイルを 1 つも削除せずにすべて削除しようとしています。指定したディレクトリを保持できますが、現在のコードではその内容を保持できません。内部のすべてが削除されるため、空のフォルダーデータがそのまま残ります。そのフォルダとその内容を削除しないようにするにはどうすればよいですか?

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();
         }
      }
   }
}    
4

2 に答える 2

0

問題は、再帰的な関数呼び出しが行われる方法です。メイン関数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();
            }
         }
      }
   }
于 2013-06-24T18:38:49.407 に答える