次のファイルを作成(または上書き)したいと想像してください:-C:\Temp\Bar\Foo\Test.txt
File.Create(..) メソッドを使用すると、これを実行できます。
しかし、次のいずれかのフォルダーがない場合(上記のパスの例から)
それから DirectoryNotFoundException がスローされます。
..パスを指定した場合、そのパスにファイルを作成するために必要なすべてのフォルダーを再帰的に作成するにはどうすればよいですか?。TempまたはBarフォルダーが存在する場合、しかしFooはそうではありません...それも作成されます。
簡単にするために、セキュリティ上の懸念がないことを想定してみましょう-すべての許可は大丈夫などです。
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
Directory.GetCreationTime(path));
このMSDNページ を参照してください。
お役に立てば幸いです!
他の回答でコメントされていることを要約するには:
//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Directory.CreateDirectory
はディレクトリを再帰的に作成し、ディレクトリが既に存在する場合はエラーなしで戻ります。
C:\Temp\Bar\Foo
にファイルFoo
があった場合、例外がスローされます。
ファイルを作成する前に Directory.CreateDirectory を使用します。フォルダーを再帰的に作成します。
パスの両方の部分(ディレクトリとファイル名)をチェックし、存在しない場合はそれぞれを作成する必要があります。
File.Exists
とDirectory.Exists
を使用して、それらが存在するかどうかを調べます。 Directory.CreateDirectory
はパス全体を作成するので、ディレクトリが存在しない場合に一度だけ呼び出すだけで、ファイルを作成するだけです。
Directory.CreateDirectoryを使用する必要があります。
。パスを指定すると、そのパスのファイルを作成するために必要なすべてのフォルダーを再帰的に作成する方法は..
パスで指定されたすべてのディレクトリとサブディレクトリを作成します。
Directory.CreateDirectory(path);
その後、ファイルを作成できます。
私はここに他の答えがあることを知っていますが、それらのどれも完全ではありません。次のコードはディレクトリを作成(存在しない場合)&ファイルをコピーします。
// 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"));
}
}
}
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);
}
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);
}
}
}
}