ファイルを作成するために存在しないディレクトリを作成するにはどうすればよいですか?


202

ここに、ディレクトリが存在しない場合に壊れるコードがあります。

System.IO.File.WriteAllText(filePath, content);

1行(または数行)で、新しいファイルにつながるディレクトリが存在しないかどうかを確認し、存在しない場合は、新しいファイルを作成する前にそれを作成できますか?

.NET 3.5を使用しています。



@TimSchmelter、「可能性のある重複」は、クリーンアップする方法です。同様の質問を閉じて、最良の回答を持つ質問を保持します。日付は必須ではありません。meta.stackexchange.com/questions/147643/を参照してください。明確化が必要であることに同意する場合は、meta.stackexchange.com / questions / 281980 /…に
Michael Freidgeim

回答:


394

作成するには

(new FileInfo(filePath)).Directory.Create() ファイルに書き込む前。

....または、存在する場合は作成します(それ以外は何もしません)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
ネストされたフォルダの作成が必要な状況を処理するためのエレガントなソリューション。
デニージェイコブ

ありがとうございました!stackoverflow.com/questions/9065598を見ましたが、ファイルへの絶対パスから始めたいと思っていて、パスの分割を扱いたくありませんでした。これで、FileInfoインスタンスからディレクトリにアクセスできることがわかりました。
ヨハン

これを行う非同期の方法はありますか?
ジョー・フィリップス

1
私はあなたがそれでそれをすることができると思いますTask.Run(() => );
Don

107

次のコードを使用できます

  DirectoryInfo di = Directory.CreateDirectory(path);

41
Directory.CreateDirectoryまさにあなたが望むことをします:それがまだ存在しない場合、それはディレクトリを作成します。最初に明示的なチェックを行う必要はありません
パオロモレッティ

13
pathであり、ディレクトリではない場合、IOExceptionをスローします。msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
怖い人2015

34

@hitecが言ったように、適切な権限があることを確認する必要があります。権限がある場合は、次の行を使用してディレクトリの存在を確認できます。

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

ファイルを存在しないディレクトリに移動するエレガントな方法は、ネイティブのFileInfoクラスに次の拡張機能を作成することです。

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

次に、新しいMoveTo拡張機能を使用します。

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

メソッド拡張のドキュメントを確認してください。


-1

あなたは使用することができますFile.Existsをファイルが存在するかどうかを確認するために、それは使用して作成しFile.Createを必要に応じて。その場所にファイルを作成するアクセス権があるかどうかを確認してください。

ファイルが存在することを確認したら、安全にファイルに書き込むことができます。予防策として、コードをtry ... catchブロックに入れて、予定どおりに機能しない場合に関数が発生する可能性のある例外をキャッチする必要があります。

基本的なファイルI / Oの概念に関する追加情報


最初は、存在しない可能性のあるファイルに書き込みたいという質問を誤って読みました。ただし、ファイルIOとディレクトリIOの概念は基本的に同じです。
hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); ディレクトリがすでに存在する場合、このメソッドは何もしません。

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

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