web-dev-qa-db-fra.com

Comment créer un fichier ET des dossiers si ceux-ci n'existent pas?

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)

  • Temp
  • Bar
  • Foo

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.

118
Pure.Krome
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!

106

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.

115
hultqvist

Utilisez Directory.CreateDirectory avant de créer le fichier. Il crée le dossier récursivement pour vous.

16
Grzenio

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.

3
Oded

Vous devez utiliser Directory.CreateDirectory.

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

2
Nick

. é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.

2
Arseny

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"));
        }
    }
}
1
Mehdi Dehghani

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

Comprendre la sécurité d'accès au code .NET

La "sécurité d'accès au code" est-elle réellement utilisée?

0
PRR

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

}

}

0
Markive