Perché le directory per i file non sono create automaticamente? [chiuso]

-4

Uno dei più fastidiosi bug da bonehead in cui mi imbatto è provare a creare un nuovo file in una directory che non esiste. (Almeno su Windows / NTFS, non sono sicuro di altre combinazioni OS / FS.)

Ecco come avviene di solito in C #:

const string directoryName = @"logDir\";

// This would prevent the exceptions.
//Directory.CreateDirectory(directoryName);

const string logMessage = "Logging a line!";
try
{
    const string fileName = directoryName + "Log.txt";
    File.AppendAllText(fileName, logMessage + Environment.NewLine);
}
catch (DirectoryNotFoundException)
{
    Console.WriteLine("Yup, complaining about directory not found when trying to append.");
}

try
{
    const string databaseName = directoryName + "Log.sqlite";
    using (var connection = new SQLiteConnection($"Data Source={databaseName};Version=3;"))
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "CREATE TABLE IF NOT EXISTS log(message); INSERT INTO log(message) VALUES(@message);";
            command.Parameters.AddWithValue("@message", logMessage);
            command.ExecuteNonQuery();
        }
        connection.Close();
    }
}
catch (SQLiteException)
{
    Console.WriteLine("Yup, even sqlite, which will create the file if it doesn't exist, requires a separate step to create a directory.");
}

Se l'API fornisce la possibilità di aggiungere file o crearli se non esiste, perché la stessa capacità non creerebbe anche la directory richiesta se non esiste? Qual è la logica alla base di un simile comportamento?

Potrebbe essere una domanda stupida, ma dovevo chiederti perché sono infastidito quando è necessario un passaggio extra facile da eseguire perché il codice funzioni correttamente e non ne vedo i benefici.

    
posta relatively_random 14.12.2017 - 11:42
fonte

2 risposte

3

Quando si confronta un input errato, un'API ha due scelte:

  • genera un errore, lasciando qualsiasi altra decisione al chiamante
  • fornire un risultato privo di errori indovinando quale fosse l'intenzione del chiamante

Di solito è preferibile la prima scelta: l'API fornisce un contratto chiaro e semplice ai suoi clienti che consente loro di sapere il prima possibile quando si verifica un errore.

Ad esempio, il comando Unix mkdir non è in grado di creare sottodirectory di propria iniziativa:

mkdir foo/bar

genera un errore.

A meno che non sia specificato esplicitamente:

mkdir -p foo/bar

Per quanto riguarda il motivo per cui la creazione di un file nella sottodirectory inesistente è considerata un input errato, scommetto che derivi dal principio del minimo stupore: storicamente, questo è stato il modo più comune per creare file.

    
risposta data 14.12.2017 - 13:20
fonte
1

Per i sistemi operativi più moderni, le directory e i file hanno una serie di permessi (e altri dettagli) che determinano quali operazioni possono essere eseguite sul file o sulla directory da chi / cosa. Quando viene creato un file, (in base all'API) si specificano esplicitamente le autorizzazioni desiderate o si ottengono "valori predefiniti generici" (che sono probabilmente meno ideali / meno appropriati). Questo non è un problema, perché il processo che crea il file è probabilmente l'unico processo realmente realizzato dalle autorizzazioni risultanti "incautamente non specificate".

Quando viene creata una directory, le autorizzazioni influiscono su tutto ciò che viene inserito in tale directory da qualsiasi persona o processo. Non è qualcosa che dovrebbe mai usare un default generico da un processo perché è molto più probabile che abbia effetto più di un solo processo.

Non dimenticare che la creazione automatica di directory dovrebbe essere ricorsiva. Ad esempio, se si desidera creare il file "/foo/bar/baz/hello.txt", potrebbe essere necessario creare automaticamente "/ foo" e "/ foo / bar" e "/ foo / bar / baz" ".

    
risposta data 14.12.2017 - 12:28
fonte

Leggi altre domande sui tag