2016-08-07 44 views
0

Ich versuche, eine Datei oder einen Ordner basierend auf einem Pfad zu löschen, der keine Erweiterung enthält.NodeJS: Entfernen Sie eine Datei/einen Ordner basierend auf einem Pfad ohne Erweiterung (Design-Ansatz)


Nehmen wir an, ich den folgenden Pfad haben:

/home/tom/windows 

windows kann ein Ordner namens Fenster oder eine Datei windows.txt

genannt werden, da der Pfad selbst nicht die Erweiterung enthält (.txt) muss das Skript raten, ob es den Ordner (falls vorhanden) oder die Datei (falls vorhanden) löschen soll.

Anfängliche Ansatz:

fs.stat(path, (err, stats) -> 

/* ---------- RUN IF PATH IS VALID ---------- */ 

// If we don't have any erros and the path is a directory, 
// simply remove that directory and end here 

if (!err && stats.isDirectory()) 
    fs.rmdir(path, (err) -> 
     if (err) then return done(err) 

     return done(null, 1) 
    ) 

/* ---------- ---------- ---------- ---------- -- */ 


/* ---------- RUN IF PATH IS NOT VALID ---------- */ 

// If we have an error other than "ENOENT" (non-existend file) 
// then return 

if (err.code != 'ENOENT') then return done(err) 


// Now we know that the path must be a file, thus verify 
// its type and extension then unlink 

fs.stat(path + '.txt', (err, stats) -> 
    if (err) then return done(err) 
    if (!stats.isFile()) then return done(err) 

    fs.unlink(path + '.txt', (err) -> 
     if (err) then return done(err) 

     done(null, 1) 
    ) 

) 

Erläuterung:

Testen Sie, ob Pfad über fs.stat existiert dann prüfen, ob es ein Verzeichnis ist. Wenn es ein Verzeichnis ist, entfernen Sie es einfach und beenden Sie die Ausführung.

Fortfahren, wenn die Bedingungen im vorherigen Schritt nicht übereinstimmen. Untersuchen Sie, warum die Bedingungen nicht übereinstimmten (err.code). Wenn der Fehler nicht für eine nicht vorhandene Datei gilt, beenden Sie die Ausführung.

[ELSE]

weiter, da wir wissen, dass die Pfaddatei sein muss, da wir vorher geprüft, ob es ein Verzeichnis ist. Fügen Sie die Erweiterung (.txt) an und stellen Sie sicher, dass die Datei wirklich existiert. Wenn dies der Fall ist, heben Sie einfach die Verknüpfung der Datei auf.


Ein anderer Ansatz:

ich die Erweiterung anhängen könnte direkt auf den Pfad und verwenden fs.unklink() und Test für einen Fehlercode genannt EISDIR. Wenn false, muss der Pfad eine gültige Datei sein und daher entfernen. Wenn das stimmt, löschen dir

fs.unlink(path + '.txt', (err) -> 
    //Path is a valid file, thus remove 
    if (!err) then return done(null, 1) 

    //Path is not valid file, thus check if directory 
    if (err.code != 'ENOENT' && err.code != 'EISDIR') 
     return done(err) 

    //Path is directory so remove it 
    fs.rmdir(path, (err) -> 
     if (err) then return done(err) 

     done(null, 1) 
    ) 
) 

Fazit?

Gibt es Verbesserungen, Lösungen oder Designkonzepte?

+0

Sie sicher, dass Sie nicht über denken das? –

+0

Ich weiß, es ist ziemlich kompliziert, aber am Ende möchte ich einen solchen Ansatz auch auf andere FS-Methoden anwenden. Zum Beispiel '' 'rename()' ''. Das Problem besteht darin, dass der Pfad die Erweiterung zuvor nicht enthält. – Steven

+0

Es ist überhaupt nicht kompliziert, deshalb habe ich mich gefragt, warum du so besorgt bist. –

Antwort

0

Vor ein paar Monaten habe ich dieses Problem gelöst, indem ich ein NodeJS-Modul geschrieben habe.

Die Engine erfasst einen Ordner und/oder eine Datei basierend auf einem Pfad unter Verwendung eines versprochenen asynchronen Steuerungsflusses. Also genau das, was ich brauchte.

Es spielt keine Rolle, ob ein Ordner und eine Datei denselben Namen haben oder ob die Erweiterung nicht bekannt ist. Die Engine versucht, basierend auf den bereitgestellten Optionen, eine der beiden Methoden zu erfassen.

Das Modul ist Open-Source und verfügbar über NPM und Github:

https://github.com/Burnett01/fs-capture

https://www.npmjs.com/package/fs-capture