Como crio um diretório se ele não existe para criar um arquivo?

202

Eu tenho um pedaço de código aqui que quebra se o diretório não existir:

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

Em uma linha (ou algumas linhas), é possível verificar se o diretório que leva ao novo arquivo não existe e, se não, criá-lo antes de criar o novo arquivo?

Estou usando o .NET 3.5.

Unidade de disco
fonte
1
Possível duplicata de Se uma pasta não existir, crie-a
Michael Freidgeim 28/11
@ TimSchmelter, "Possível duplicata" é uma maneira de limpar - fechar perguntas semelhantes e manter uma com as melhores respostas. A data não é essencial. Consulte meta.stackexchange.com/questions/147643/… Se você concorda que exige esclarecimentos, vote em meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Respostas:

394

Para criar

(new FileInfo(filePath)).Directory.Create() Antes de gravar no arquivo.

.... Ou, se existir, crie (senão não faça nada)

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);
Don
fonte
5
Solução elegante, pois lida com situações que exigem a criação de pastas aninhadas.
Denny Jacob
Obrigado! Vi stackoverflow.com/questions/9065598 , mas queria começar com o caminho absoluto para um arquivo e não queria lidar com a divisão do caminho. Agora eu sei que você pode acessar o diretório a partir da instância FileInfo.
Johann
Existe uma maneira assíncrona de fazer isso?
21819 Joe
1
Suponho que você poderia fazê-lo Task.Run(() => );.
Don
107

Você pode usar o seguinte código

  DirectoryInfo di = Directory.CreateDirectory(path);
RAM
fonte
41
Directory.CreateDirectoryfaz exatamente o que você deseja: Ele cria o diretório se ainda não existir. Não há necessidade de fazer uma verificação explícita primeiro .
Paolo Moretti
13
Lança um IOException se pathfor um arquivo e não um diretório. msdn.microsoft.com/pt-br/library/54a0at6s(v=vs.110).aspx
scaryman
34

Como o @hitec disse, você deve ter certeza de que possui as permissões corretas; se tiver, poderá usar esta linha para garantir a existência do diretório:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))

willvv
fonte
0

Uma maneira elegante de mover seu arquivo para um diretório inexistente é criar a seguinte extensão para a classe FileInfo nativa:

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

Em seguida, use a nova extensão MoveTo:

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

Verifique a documentação da extensão Methods .

MiguelSlv
fonte
-1

Você pode usar File.Exists para verificar se o arquivo existe e criá-lo usando File.Create se necessário. Verifique se você tem acesso para criar arquivos nesse local.

Quando tiver certeza de que o arquivo existe, você poderá gravá-lo com segurança. Embora como precaução, você deve colocar seu código em uma tentativa ... capturar um bloco e capturar as exceções que essa função provavelmente aumentará se as coisas não saírem exatamente como o planejado.

Informações adicionais para conceitos básicos de E / S de arquivo .

alta tecnologia
fonte
Inicialmente, li errado sua pergunta que você deseja gravar em um arquivo que pode não existir. Os conceitos são essencialmente os mesmos para E / S de arquivo e diretório.
hitec
-2

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

var file = new FileInfo(filePath);

file.Directory.Create(); Se o diretório já existir, esse método não fará nada.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Godwin Awojobi
fonte