2012-02-03 23 views
11

Doświadczyłem tego od dłuższego czasu, więc każda pomoc jest bardzo cenna. Tak więc, pobieram plik i zapisuję go za pomocą PhantomJS i CasperJS. Pozwolę sobie wskazać, że nie są one problemem. Plik jest pobierany bez problemu.NodeJS fs.open nie działa na istniejącym pliku (nie dotyczy ścieżki)

Problem polega na tym, że NodeJS nie rozpoznaje ani nie otwiera pliku po jego pobraniu. Nie mogę fs.stat, fs.open, itp. Nic nie działa.

będę dzielić kod w drugim, ale oto log:

Here: bdTcK6hSdownload.csv 

[ '2puzZMeLdownload.csv', 
    '2s5ICbKNdownload.csv', 
    'bdTcK6hSdownload.csv', 
    'izIfagwCdownload.csv' ] 

fs.js:230 

return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); 

Error: ENOENT, no such file or directory './caspertemp/bdTcK6hSdownload.csv' 

at Object.openSync (fs.js:230:18) 
at Object.processCSV (/Users/Home/dev/node_modules/inviter/index.js:64:29) 
at /Users/Home/dev/node_modules/inviter/index.js:36:33 
at ChildProcess.exithandler (child_process.js:281:7) 
at ChildProcess.emit (events.js:70:17) 
at maybeExit (child_process.js:361:16) 
at Process.onexit (child_process.js:397:5) 

Jak widać, jestem drukując utworzoną nazwę pliku, a następnie drukowanie zawartości katalogu, a następnie próbuje otworzyć plik. Jak widać, plik bdTcK6hSdownload.csv istnieje w katalogu, ale kończy się niepowodzeniem.

Kod prosty fragment jest tutaj:

console.log('Here: ' + filename); 

filenames = fs.readdirSync('./caspertemp/'); 
console.log(filenames); 

var fd = fs.openSync('./caspertemp/' + filename, 'r'); 
console.log(fd); 

Istnieje grono więcej dzieje się przed i po tym, ale nic z tego nie ma znaczenia, ponieważ to podstawowa funkcja nie powiedzie się. Proszę pomóż! To było dokuczliwe od tygodni.

+1

Hmm. Czy sprawdziłeś uprawnienia? Uruchom także plik node.js tak: strace ./node - to prześle wszystkie wywołania systemowe i szukasz otwartego(), sprawdź, czy węzeł ścieżki używa, itp. To powie ci, co faktycznie robi proces węzła. – EdH

+0

@EdH Dla uprawnień tak Wszystkie pliki mają te same uprawnienia: '-rw-r - r-- 1 Pracownicy domowi 216102 Feb 3 15:00 bdTcK6hSdownload.csv' Warto również zauważyć, że jeśli zrestartuję węzeł, mogę dostęp do pliku bez problemu – Brandon

+0

@ EdH.Hmm, nie mogę uruchomić w trybie strace z jakiegoś powodu: mac: dev Home $ strace -fF -o strace.lo g węzeł app.js -bash: strace: polecenie nie znalezione - nie jestem pewien, co robię źle z tym poleceniem – Brandon

Odpowiedz

3

Przypuszczam, że jest to rozbieżność w bieżącym katalogu roboczym. Czy uruchamiasz procesy casperJS i node.js z tego samego katalogu? Czy któryś z nich zmienia katalog roboczy w czasie wykonywania? Spróbuj coś takiego, gdzie węzła __dirname daje ścieżkę katalogu aktualnie wykonującego .js pliku

var path = require("path"); 
var filename = "bdTcK6hSdownload.csv"; 
var csvPath = path.resolve(path.join(__dirname, "caspertemp", filename)); 
console.log(csvPath); 
+0

Doceniam przemyślaną odpowiedź i przykład, ale z kodu, który napisałem, wynika, że ​​zwracają ten sam katalog. Caspertemp jest w katalogu głównym, ale katalog roboczy znajduje się w module node_modules. Na przykład, jeśli użyję twojego kodu i usunę zmienną __dirname, otrzymuję to: /Users/Home/dev/caspertemp/pwAA3Kzzdownload.csv ENOENT, brak takiego pliku lub katalogu '/ Users/Home/dev/caspertemp /pwAA3Kzzdownload.csv – Brandon

0

Inną możliwością jest rozrządu.

W przeszłości miałem sytuacje, w których wpisy do pliku pojawiły się od razu w tym folderze, ale plik nie nadaje się do użytku, ponieważ plik, który go napisał, nie został jeszcze zakończony lub jeszcze nie został zwolniony. W tych warunkach nie jest niczym niezwykłym, aby odroczyć przetwarzanie lub przeprowadzić inne kontrole, aby sprawdzić, czy wszystko jest gotowe.

Przy tych okazjach może się zdarzyć, że restart "naprawi" pewne rzeczy, ale tylko dlatego, że jako efekt uboczny albo zwalnia przetwarzanie uchwytu albo opóźnienia, więc kiedy twój kod spróbuje ponownie, wszystko jest w porządku.

0

Występuje tylko wtedy, gdy podajesz złą ścieżkę. Znalazłem ten sam problem.

Początkowo uruchomiłem plik bezpośrednio węzeł xyz.js, a wymagane pliki statyczne znajdują się w tym samym repozytorium. Ale kiedy robię npm zacząć, kod rzucał powyższy błąd:

fs.js 495 
    return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); 
    **Error: ENOENT, no such file or directory** 

Potem przeniósł zasobów statycznych, przemianowane ścieżkę i to działało. Mam nadzieję, że to może ci pomóc.

0

Rozszerzenie pliku można wprowadzić dwukrotnie, dlatego nie znaleziono. Przejdź do katalogu plików ze swoim wierszu polecenia i uzyskać listę plików w tym katalogu

polecenie:

dir 

lub

ls 

uzyskać rzeczywistą nazwę pliku i używać go tam. W moim przypadku zapisałem dokument tekstowy jako "readMe.txt "i w wierszu polecenia pojawił się jako" readMe.txt.txt ". Nie musiałem dołączać rozszerzenia pliku podczas zapisywania, co spowodowało powstanie problemu:

Powiązane problemy