imaginez que je souhaite créer (ou écraser) le fichier suivant: - C:\Temp\Bar\Foo\Test.txt
En utilisant la méthode File.Create (..) , cela peut le faire.
MAIS, si je n'ai pas l'un des dossiers suivants (à partir de cet exemple chemin, ci-dessus)
alors je reçois un DirectoryNotFoundException jeté.
Alors .. étant donné un chemin, comment pouvons-nous créer récursivement tous les dossiers nécessaires pour créer le fichier .. pour ce chemin? Si des dossiers Temp ou Bar existent , mais Foo ne le fait pas ... alors cela est créé aussi.
Pour plus de simplicité, supposons qu'il n'y ait pas de problème de sécurité - toutes les autorisations sont correctes, etc.
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
Directory.GetCreationTime(path));
Voir cette page MSDN .
J'espère que ça aide!
Pour résumer ce qui a été commenté dans d’autres réponses:
//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Directory.CreateDirectory
créera les répertoires de manière récursive et si le répertoire existe déjà, il retournera sans erreur.
S'il y avait un fichier Foo
à C:\Temp\Bar\Foo
une exception sera levée.
Utilisez Directory.CreateDirectory avant de créer le fichier. Il crée le dossier récursivement pour vous.
Vous devrez vérifier les deux parties du chemin (répertoire et nom du fichier) et les créer si elles n'existent pas.
Utilisation File.Exists
et Directory.Exists
pour savoir s’ils existent. Directory.CreateDirectory
créera le chemin complet pour vous, vous n'aurez donc besoin d'appeler qu'une seule fois si le répertoire n'existe pas, puis créez simplement le fichier.
Vous devez utiliser Directory.CreateDirectory.
. étant donné un chemin, comment pouvons-nous créer récursivement tous les dossiers nécessaires pour créer le fichier .. pour ce chemin
Crée tous les répertoires et sous-répertoires comme spécifié par chemin.
Directory.CreateDirectory(path);
alors vous pouvez créer un fichier.
Je sais qu'il existe d'autres réponses ici, mais aucune d'entre elles n'est pas assez complète, le code suivant va créer des répertoires (s'il n'existe pas) & then copier des fichiers.
// 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"));
}
}
}
En supposant que votre Assemblée/votre EXE a FileIO la permission est elle-même, bien ce n’est pas correct. Votre application peut ne pas fonctionner avec des droits d'administrateur. Il est important de prendre en compte Code Access Security et demandepermissions Exemple de code:
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);
}
Vous voulez Directory.CreateDirectory ()
Voici une classe que j’utilise (convertie en C #); si vous lui transmettez un répertoire source et une destination, tous les fichiers et sous-dossiers de ce répertoire seront copiés dans votre destination:
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);
}
}
}
}