web-dev-qa-db-ja.com

フォルダーが存在しない場合、ファイルとフォルダーを作成するにはどうすればよいですか?

次のファイルを作成(または上書き)したいと想像してください:-C:\Temp\Bar\Foo\Test.txt

File.Create(..) メソッドを使用すると、これを実行できます。

しかし、次のいずれかのフォルダーがない場合(上記のパスの例から)

  • 温度
  • バー
  • フー

それから DirectoryNotFoundException がスローされます。

..パスを指定した場合、そのパスにファイルを作成するために必要なすべてのフォルダーを再帰的に作成するにはどうすればよいですか?。TempまたはBarフォルダーが存在する場合、しかしFooはそうではありません...それも作成されます。

簡単にするために、セキュリティ上の懸念がないことを想定してみましょう-すべての許可は大丈夫などです。

118
Pure.Krome
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

このMSDNページ を参照してください。

お役に立てば幸いです!

106

他の回答でコメントされていることを要約するには:

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectoryはディレクトリを再帰的に作成し、ディレクトリが既に存在する場合はエラーなしで戻ります。

C:\Temp\Bar\FooにファイルFooがあった場合、例外がスローされます。

115
hultqvist

ファイルを作成する前に Directory.CreateDirectory を使用します。フォルダーを再帰的に作成します。

16
Grzenio

パスの両方の部分(ディレクトリとファイル名)をチェックし、存在しない場合はそれぞれを作成する必要があります。

File.ExistsDirectory.Existsを使用して、それらが存在するかどうかを調べます。 Directory.CreateDirectoryはパス全体を作成するので、ディレクトリが存在しない場合に一度だけ呼び出すだけで、ファイルを作成するだけです。

3
Oded

Directory.CreateDirectoryを使用する必要があります。

http://msdn.Microsoft.com/en-us/library/54a0at6s.aspx

2
Nick

。パスを指定すると、そのパスのファイルを作成するために必要なすべてのフォルダーを再帰的に作成する方法は..

パスで指定されたすべてのディレクトリとサブディレクトリを作成します。

Directory.CreateDirectory(path);

その後、ファイルを作成できます。

2
Arseny

私はここに他の答えがあることを知っていますが、それらのどれも完全ではありません。次のコードはディレクトリを作成(存在しない場合)&ファイルをコピーします。

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
1
Mehdi Dehghani

Assembly/exeに FileIO パーミッションがあると仮定すると、それは正しくありません。アプリケーションが管理者権限で実行されない場合があります。考慮することが重要です コードアクセスセキュリティ および リクエスト許可 サンプルコード:

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

。NETコードアクセスセキュリティについて

実世界で使用される「コードアクセスセキュリティ」はありますか?

0
PRR

Directory.CreateDirectory()が必要です

私が使用する(C#に変換された)クラスは、ソースディレクトリと宛先を渡すと、そのディレクトリのすべてのファイルとサブフォルダーを宛先にコピーします。

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

        if (!Directory.Exists(destination)) {
            Directory.CreateDirectory(destination);
        }

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

    if (!Directory.Exists(destination)) {
        Directory.CreateDirectory(destination);
    }

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}

0
Markive