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.



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

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


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


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 .


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


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

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.