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


136

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

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

ただし、次のいずれかのフォルダがない場合(上記のサンプルパスから)

  • 温度
  • バー
  • フー

その後、DirectoryNotFoundExceptionがスローされます。

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

簡単にするために、セキュリティの問題がないと仮定しましょう-すべての権限は問題ありません。



回答:


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

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

お役に立てば幸いです。


82
最初Directory.CreateDirectoryDirectory.Existsチェックなしで盲目的に呼び出すことができます-ディレクトリがすでにそこにある場合はスローされません。
Tim Robinson

1
@ティム:わからなかったので、誰にでも投げました。情報ありがとうございます。
クリストファーB.アドキンス2010

24
そして、絶対Path.GetDirectoryName(string path)パスからディレクトリを取得することを忘れないでください
Oliver

@Oliver:DirectoryクラスとDirectoryInfoクラスに対応する機能はたくさんありますが、私が提供したコードは、彼に正しい方向への推進力を与えるのに十分でした。リンクもかなり拡大すると思います。
クリストファーB.アドキンス2010

8
*注:変数にpathはファイル名を含めないでください。OPの例を使用してそうpathでなければなりませんC:\Temp\Bar\Foo。呼び出した後Directory.CreateDirectory(path);File.Create("C:\Temp\Bar\Foo\Test.txt");、ファイルを作成するために呼び出す必要があります。
sazr 2014年

139

他の回答でコメントされた内容を要約するには:

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

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

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


長いパス(256以上)を処理している場合は、stackoverflow.com
questions / 5188527 /…を


3

。パスを指定して、ファイルを作成するために必要なすべてのフォルダを再帰的に作成するにはどうすればよいですか。

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

Directory.CreateDirectory(path);

次に、ファイルを作成します。


2
ファイル名のないパス:)
Sameera R. '10

「すべてのディレクトリとサブディレクトリ」不正解:最大で1つのディレクトリと必要なすべてのサブディレクトリが作成されます。
Camilo Terevinto 2016年

3

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

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


Directory.CreateDirectoryの場合、どの部分が存在するかを確認する必要はありません。必要なすべてのディレクトリが作成されます(確認する必要があるのは、ターゲットディレクトリがまだ存在していないことです)。
Gertjan、2010

その場合、最初の行を削除することをお勧めします。ルートから各部分を確認する必要がないため、完全なパスを確認し、存在しない場合は作成するだけです。
Gertjan、2010

@Gertjan-回答が更新されました...今すぐあなたの基準を満たしていることを願ってください;)
Oded

:)それは:)します(あなたが間違っていることを証明したり、気分を害したりするのは私のポイントではありませんでしたが、初心者は答えを明確にすることができます)
Gertjan


0

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

}

}


2
この行のため、私はこれをダウングレードする必要があります:using Microsoft.VisualBasic;悪!!
Pure.Kromeが2010

2
そして、なぜMicrosoft.VisualBasicは悪か?これは、.Net Frameworkの他の人と同じようなアセンブリです。
オリバー

2
他の言語全体の名前空間を不必要にインポートしているからだと思います。
Markive、2010

0

アセンブリ/ 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コードアクセスセキュリティについて

「コードアクセスセキュリティ」は実際に使用されていますか?


1
@ Pure.Krome:私の回答は対象外ですが、特権リソースにアクセスするときは、セキュリティとアクセス制御を考慮してください。あなたの質問を追い越したり複雑にしたりするつもりはありません:)
PRR 2010

0

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

// 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"));
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.