Próbowałem znaleźć sposób na zapisanie pliku przy użyciu Node.js, ale bez powodzenia. Jak mogę to zrobić?
1645
Interfejs API systemu plików zawiera wiele szczegółów . Najczęstszym sposobem jest:
const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }
Jak mogę zmodyfikować ten skrypt, aby działał poza/tmp
?/home/...
. Ogólnie ten katalog to 755 root: wheel (lub cokolwiek innego). Jeśli węzeł chce zapisać plik jako Jane, łatwiej będzie pisać/home/jane/test.txt
. Zmiana/home
na coś bardziej liberalnego niż 755 to ogromny błąd./home
katalogu, zaproponowałem chmod. Wiem, że może to generować problem bezpieczeństwa. Ale cóż, jeśli użytkownik chce tam zapisać, to jest rozwiązanie. PS: Zgadzam się z tym, co powiedziałeś (:Obecnie istnieją trzy sposoby zapisania pliku:
fs.write(fd, buffer, offset, length, position, callback
)Musisz poczekać na wywołanie zwrotne, aby upewnić się, że bufor jest zapisany na dysku. To nie jest buforowane.
fs.writeFile(filename, data, [encoding], callback)
Wszystkie dane muszą być przechowywane jednocześnie; nie można wykonywać zapisów sekwencyjnych.
fs.createWriteStream(path, [options]
)Tworzy
WriteStream
, co jest wygodne, ponieważ nie trzeba czekać na oddzwonienie. Ale znowu nie jest buforowane.A
WriteStream
, jak sama nazwa wskazuje, jest strumieniem. Strumień z definicji jest „buforem” zawierającym dane, które poruszają się w jednym kierunku (źródło ► miejsce docelowe). Ale zapisywalny strumień niekoniecznie jest „buforowany”. Strumień jest „buforowany” podczas zapisywanian
czasów, a jednocześnien+1
strumień wysyła bufor do jądra (ponieważ jest pełny i wymaga opróżnienia).Innymi słowy: „Bufor” to obiekt. To, czy „jest buforowane”, jest własnością tego obiektu.
Jeśli spojrzysz na kod,
WriteStream
dziedziczy po zapisywalnymStream
obiekcie. Jeśli zwrócisz uwagę, zobaczysz, jak opróżniają zawartość; nie mają żadnego systemu buforowania.Napisany ciąg znaków jest konwertowany na bufor, a następnie wysyłany do warstwy natywnej i zapisywany na dysku. Podczas pisania ciągów nie wypełniają żadnego bufora. Więc jeśli to zrobisz:
Robisz:
To trzy połączenia z warstwą we / wy. Chociaż używasz „buforów”, dane nie są buforowane. Buforowany strumień wykonałby:
fs.write(new Buffer ("abc"))
jedno wywołanie warstwy I / O.Na razie w Node.js v0.12 (stabilna wersja ogłoszona 02/06/2015) obsługuje teraz dwie funkcje:
cork()
iuncork()
. Wygląda na to, że te funkcje pozwolą wreszcie buforować / opróżniać wywołania zapisu.Na przykład w Javie istnieje kilka klas, które zapewniają buforowane strumienie (
BufferedOutputStream
,BufferedWriter
...). Jeśli zapiszesz trzy bajty, te bajty zostaną zapisane w buforze (pamięci) zamiast wykonywania We / Wy tylko dla trzech bajtów. Gdy bufor jest pełny, zawartość jest opróżniana i zapisywana na dysku. Poprawia to wydajność.Nic nie odkrywam, po prostu pamiętam, jak należy uzyskać dostęp do dysku.
źródło
cork()
iuncork()
dla tych z nas, którzy chcą wypróbować węzeł 0.11 przedpremierowy?npm
wdrażania buforowanego zapisu?Możesz oczywiście uczynić to trochę bardziej zaawansowanym. Nieblokowanie, pisanie bitów i kawałków, nie zapisywanie całego pliku na raz:
źródło
Zapis synchroniczny
Zapis asynchroniczny
Gdzie
Warto przeczytać ten offical File System (FS) docs .
źródło
źródło
fs.write()
), ten przykład działa tylko wtedy, gdy wszystko jest wystarczająco krótkie, aby można je było zapisać w jednym wywołaniu zapisu.Podobał mi się Indeks ./articles/file-system .
To zadziałało dla mnie.
Zobacz także Jak pisać pliki w node.js? .
Zawartość helloworld.txt:
Aktualizacja:
Jak w węźle Linuksa, pisz w bieżącym katalogu, wydaje się, że w niektórych innych tak nie jest, więc dodam ten komentarz na wszelki wypadek:
Używając tego,
ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
aby dostać się tam, gdzie zapisany jest plik.źródło
Odpowiedzi są opatrzone datą, a nowszym sposobem na to jest:
zobacz dokumenty tutaj, aby uzyskać więcej informacji
źródło
(node:23759) ExperimentalWarning: The fs.promises API is experimental
v10.15.0
Wiem, że pytanie dotyczące „zapisu”, ale w bardziej ogólnym znaczeniu, „append” może być przydatne w niektórych przypadkach, ponieważ można łatwo użyć go w pętli, aby dodać tekst do pliku (niezależnie od tego, czy plik istnieje). Użyj „\ n”, jeśli chcesz dodać linie, np .:
źródło
const
zamiastvar
, tj. Wconst fs = require('fs');
celu uniknięcia niepożądanych efektów ubocznych, w szczególności jeśli pracujesz z nieco większą bazą kodu.OK, jest to dość proste, ponieważ Node ma wbudowaną funkcjonalność do tego, nazywa się to,
fs
co oznacza system plików i, w zasadzie, moduł systemu plików NodeJS ...Więc najpierw wymagaj tego w pliku server.js w następujący sposób:
fs
ma kilka metod zapisu do pliku, ale moim preferowanym sposobem jest użycieappendFile
, to doda rzeczy do pliku, a jeśli plik nie istnieje, utworzy jeden, kod może wyglądać jak poniżej:źródło
Na przykład: odczytaj plik i zapisz do innego pliku:
źródło
writeFile
?Możesz pisać do pliku za pomocą modułu fs (system plików).
Oto przykład, jak możesz to zrobić:
Możesz także pozbyć się tej struktury kodu wywołania zwrotnego wewnątrz wywołania zwrotnego, używając Obietnic i
async
/ lubawait
instrukcji. Spowoduje to, że struktura kodu asynchronicznego będzie o wiele bardziej płaska. Do tego służy przydatna funkcja util.promisify (oryginalna) . Pozwala nam przejść z oddzwaniania do obietnic. Spójrz na przykład zfs
funkcjami poniżej:źródło
Tutaj używamy w + do odczytu / zapisu obu akcji, a jeśli ścieżka pliku nie zostanie znaleziona, zostanie utworzona automatycznie.
Treść oznacza, co musisz zapisać do pliku i jego długość, „content.length”.
źródło
Oto przykład, jak odczytać plik csv z lokalnego i zapisać plik csv do lokalnego.
źródło
Po przeczytaniu tego długiego artykułu. Powinieneś zrozumieć, jak to działa. Oto przykład
createWriteStream()
.źródło
createWriteStream
było już wspomniane w wielu latach odpowiedzi przed tym.Możesz użyć biblioteki
easy-file-manager
zainstaluj najpierw z npm
npm install easy-file-manager
Próbka do przesłania i usunięcia plików
źródło
This modules is created to save and remove files.
. Nie odpowiedź.Możesz zapisać w pliku za pomocą następującego przykładu kodu:
źródło
writeFile
już wiele lat temu udzielono odpowiedzi jako odpowiedzi. Co dodaje ta odpowiedź?