Como crio um arquivo E quaisquer pastas, se as pastas não existirem?


136

Imagine que desejo criar (ou substituir) o seguinte arquivo: - C:\Temp\Bar\Foo\Test.txt

Usando o método File.Create (..) , isso pode ser feito.

MAS, se eu não tiver uma das seguintes pastas (desse caminho de exemplo, acima)

  • Temp
  • Barra
  • Foo

então recebo uma DirectoryNotFoundException lançada.

Então .. dado um caminho, como podemos criar recursivamente todas as pastas necessárias para criar o arquivo .. para esse caminho? Se as pastas Temp ou Bar existirem, mas Foo não ... então isso também será criado.

Para simplificar, vamos supor que não haja problemas de segurança - todas as permissões são boas etc.



Respostas:


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

Veja esta página do MSDN .

Espero que ajude!


82
Você pode ligar às cegas Directory.CreateDirectorysem o Directory.Existscheque primeiro - ele não será emitido se o diretório já estiver lá.
Tim Robinson

1
@ Tim: Não tinha certeza, então eu joguei lá dentro quem quiser. Obrigado pela informação embora.
Christopher B. Adkins

24
E não se esqueça Path.GetDirectoryName(string path)de obter o diretório do seu caminho completo
Oliver

@ Oliver: Existe toda uma série de funcionalidades que acompanham as classes Directory e DirectoryInfo, mas o código que forneci foi suficiente para dar um empurrão na direção certa. Eu acho que o link também se expande bastante.
Christopher B. Adkins

8
* NOTA: a variável pathnão deve conter o nome do arquivo. Então, usando o exemplo do OP pathdeve ser C:\Temp\Bar\Foo. Depois de ligar, Directory.CreateDirectory(path);você ainda precisa ligar File.Create("C:\Temp\Bar\Foo\Test.txt");para criar o arquivo.
sazr

139

Para resumir o que foi comentado em outras respostas:

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

Directory.CreateDirectory criará os diretórios recursivamente e, se o diretório já existir, ele retornará sem erro.

Se houver um arquivo Fooem C:\Temp\Bar\Foouma exceção, será lançada.


Se você estiver lidando com caminho longo (256+), consulte stackoverflow.com/questions/5188527/…
Alexei Levenkov


3

. dado um caminho, como podemos criar recursivamente todas as pastas necessárias para criar o arquivo .. para esse caminho

Cria todos os diretórios e subdiretórios, conforme especificado pelo caminho.

Directory.CreateDirectory(path);

então você pode criar um arquivo.


2
caminho sem nome de arquivo :)
Sameera R.

"todos os diretórios e subdiretórios" Incorreto: criará, no máximo, um diretório e todos os subdiretórios necessários.
Camilo Terevinto 17/06/2016

3

Você precisará verificar as duas partes do caminho (diretório e nome do arquivo) e criar cada uma, caso não exista.

Use File.Existse Directory.Existspara descobrir se eles existem. Directory.CreateDirectorycriará o caminho inteiro para você; portanto, você só precisará chamá-lo uma vez, se o diretório não existir, basta criar o arquivo.


Para Directory.CreateDirectory, você não precisa ver qual parte existe. Ele criará todos os diretórios necessários (a única coisa para garantir é que o diretório de destino ainda não exista).
Gertjan

Sugiro remover a primeira linha da sua resposta nesse caso, já que ele não precisa verificar cada parte da raiz, basta verificar o caminho completo e criá-lo se ele não existir.
Gertjan

@Gertjan - resposta atualizado ... esperança que atenda às suas normas agora;)
Oded

:) ele faz :) (que não era o meu ponto de provar que você está errado ou ofendê-lo, mas os novatos podem usar qualquer esclarecimento nas respostas)
Gertjan


0

Você deseja Directory.CreateDirectory ()

Aqui está uma classe que eu uso (convertida em C #) que, se você passar um diretório de origem e um destino, ele copiará todos os arquivos e subpastas desse diretório para o seu destino:

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
Eu deveria rebaixar isso por causa desta linha: using Microsoft.VisualBasic;Mal !!
precisa saber é o seguinte

2
E por que o Microsoft.VisualBasic é ruim? É uma montagem como qualquer outra pessoa no .Net Framework.
1013 Oliver Oliver

2
Suponho que você esteja importando desnecessariamente o espaço para nome de um outro idioma inteiro ..?
Markive

0

Supondo que seu assembly / exe tenha a permissão FileIO , ele próprio não está certo. Seu aplicativo pode não ser executado com direitos de administrador. É importante considerar a Segurança de Acesso ao Código e solicitar permissões Código de exemplo:

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

Noções básicas sobre segurança de acesso ao código .NET

O “Code Access Security” é de alguma utilidade no mundo real?


1
@ Pure.Krome: Embora minha resposta esteja fora do objetivo, ainda considere a segurança e o controle de acesso ao acessar recursos privilegiados. Nunca quis ultrapassar ou complicar a sua pergunta :)
PRR

0

Eu sei que existem algumas outras respostas aqui, mas nenhuma delas não está completa o suficiente, o código a seguir criará diretórios (se não existir) e depois copiará os arquivos .

// 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"));
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.