3

読み取り専用属性を持つサブフォルダーとファイル (ファイルとフォルダーの両方) を含むフォルダーがあります。サブフォルダーとファイルを含むこのフォルダーを削除したい。

私はこのコードを書きました:

static void Main(string[] args)
{        
    DirectoryInfo mm = new DirectoryInfo(@"c:\ex");
    string aa = Convert.ToString(mm);
    string[] allFileNames = 
        System.IO.Directory.GetFiles(aa, 
                                     "*.*", 
                                     System.IO.SearchOption.AllDirectories);
    string[] alldirNames = 
       System.IO.Directory.GetDirectories(aa, 
                                        "*", 
                                        System.IO.SearchOption.AllDirectories);

    foreach (string filename in allFileNames)
    {
        FileAttributes attr = File.GetAttributes(filename);
        File.SetAttributes(filename, attr & ~FileAttributes.ReadOnly);

    }

    foreach (string dirname in alldirNames)
    {
        FileAttributes attr = File.GetAttributes(dirname);
        File.SetAttributes(dirname, attr & ~FileAttributes.ReadOnly);
        Directory.Delete(dirname  , true);
    }

    FileInfo[] list = mm.GetFiles();

    foreach (FileInfo k in list)
    {
        k.Delete();
    }
    mm.Delete();
    Console.ReadKey();
}

問題は、プログラムを実行するたびに次のエラーが表示されることです。

パス 'c:\ex\xx\bb' の一部が見つかりませんでした。

このエラーはどういう意味ですか?

4

3 に答える 3

12
Directory.Delete(path, true);

ドキュメンテーション

于 2013-01-02T10:58:29.420 に答える
0

前の答えはうまくいくかもしれませんが、読み取り専用ファイルの問題で発生すると思います。ただし、属性 ReadOnly の削除と削除を確実に行うには、この手順を実行するための最良の方法は、方法を容易にするメソッドを使用する必要があります。たとえば、オブジェクトの正しいプロパティを使用していませんでした。

DirectoryInfo.ToString ()

を使用し、

DirectoryInfo.GetFiles (aa ...

DirectoryInfo クラス内で Framework が提供するリソースを使用していませんでした。下記参照:

    void DirectoryDelete(string strOriginalPath)
    {
        DirectoryInfo diOriginalPath = new DirectoryInfo(strOriginalPath);
        if (diOriginalPath.Attributes.HasFlag(FileAttributes.ReadOnly))
            diOriginalPath.Attributes &= ~FileAttributes.ReadOnly;

        string[] lstFileList = Directory.GetFiles(strOriginalPath);
        string[] lstdirectoryList = Directory.GetDirectories(strOriginalPath);

        if (lstdirectoryList.Length > 0)
        {
            // foreach on the subdirs to the call method recursively
            foreach (string strSubDir in lstdirectoryList)
                DirectoryDelete(strSubDir);
        }

        if (lstFileList.Length > 0)
        {
            // foreach in FileList to be delete files
            foreach (FileInfo fiFileInDir in lstFileList.Select(strArquivo => new FileInfo(strArquivo)))
            {
                // removes the ReadOnly attribute
                if (fiFileInDir.IsReadOnly)
                    fiFileInDir.Attributes &= ~FileAttributes.ReadOnly;

                // Deleting file
                fiFileInDir.Delete();
            }
        }

        diOriginalPath.Delete();
    }
于 2013-01-02T11:18:05.790 に答える
0
EmptyFolder(new DirectoryInfo(@"C:\your Path"))
Directory.Delete(@"C:\your Path");

private void EmptyFolder(DirectoryInfo directoryInfo)
{
    foreach (FileInfo file in directoryInfo.GetFiles())
    {       
       file.Delete();
     }

    foreach (DirectoryInfo subfolder in directoryInfo.GetDirectories())
    {
      EmptyFolder(subfolder);
    }
}
于 2014-05-20T05:58:53.313 に答える