2013-03-25 15 views
11

otrzymuję następujący błąd:ERRNO :: ENOENT: Nie ma takiego pliku lub katalogu rubin

"Errno::ENOENT: No such file or directory" 

gdy próbuję pobrać plik do katalogu, który nie istnieje.

Na przykład:

ftp = Net::FTP.new('example.com') 
ftp.login 
files = ftp.chdir('pub/lang/ruby/contrib') 
files = ftp.list('n*') 
ftp.getbinaryfile('nif.rb-0.91.gz', 'pub/lang/ruby/contrib/nif.gz', 1024) 
ftp.close 

Jednak dla wielu plików będę pobierania, pełna ścieżka do katalogu nie będzie istnieć. Na przykład, dopóki pierwszy plik nie utworzy knajpy, nie będzie istnieć, a dotyczy to również lang/ruby ​​/ contrib.

Czy istnieje metoda sprawdzania, czy istnieją katalogi i czy nie można ich utworzyć? Wiem, że istnieje, ale to wygląda na pliki referencyjne i nie tworzy pełnej ścieżki. Sądzę, że potrzebuję jakiejś rekurencyjnej metody przechodzenia w dół struktury folderów, dopóki nie trafi ona w nazwę pliku.

EDYCJA: mkdir_p wydaje się być dokładnie rozwiązaniem, którego potrzebuję.

Jednak kiedy używać ścieżki "/ a/b/c" Zauważyłem, że FileUtils.mkdir_p (File.dirname (localdir)) zwraca błąd: errno :: EACCES: Permission denied -/A

Jeśli usuniemy "/" z przodu, to działa. Co to powoduje? Jakie jest najlepsze rozwiązanie problemu z błędem? powinienem po prostu użyć następujących?

path="https://stackoverflow.com/a/b/c" 
if path[0]="/" 
    path=path[1..-1] 
end 

Jednak wydaje mi się, że to po prostu hack.

Odpowiedz

1

W module fileutils można użyć polecenia mkdir_p, które jest podobne do polecenia mkdir -p, które tworzy pełną ścieżkę, jeśli jeszcze nie istnieje.

9

Nie można zapisać do nieistniejącej ścieżki. Jako programista odpowiadasz za to, że ścieżki docelowe istnieją przed próbą zapisania pliku.

Ruby ma metod, które umożliwiają sprawdzanie istnienia pliku lub katalogu:

FileUtils.makedirs() to alias do mkpath i mkdir_p. Wolę makedirs, ponieważ jest to mnemonik.

Będą również przydatne:

między tymi dwoma wolę Dir.chdir, ponieważ zajmuje blok. Wszelkie akcje zachodzące w tym bloku występują w katalogu, w którym się zmieniłeś. Przy wyjściu katalog powraca do poprzedniego stanu.

1

Niezbędny jest analog * mx-mkdir -p, mkdir_p, który został podany w dwóch pozostałych odpowiedziach, ale nie widziałem, aby ktokolwiek adresował swoją edycję dotyczącą uprawnień.

Rozwiązaniem jest to, że użytkownik wywołujący twój skrypt wymaga uprawnień do zapisu w katalogu głównym.

Ścieżka "/ a/b/c" odnosi się do ścieżki głównej ("/"). Zwykle jest to zapis dostępny tylko dla użytkownika root lub użytkownika mającego dostęp do sudo.

Kiedy zmodyfikowałeś ścieżkę, aby usunąć wiodącą "/", powiedziałeś mkdir_p, aby utworzył katalogi "a/b/c" w stosunku do bieżącego katalogu roboczego zamiast względnego katalogu głównego. Powodem, dla którego zmodyfikowana wersja działa, jest to, że użytkownik wywołujący twój skrypt ruby ​​ma uprawnienia do zapisu w bieżącym katalogu roboczym.

Niezależnie od tego, jeśli konsumenci skryptu dostarczają dane wejściowe, prawdopodobnie nie będziecie chcieli usuwać wiodących ukośników, ponieważ mogą one tworzyć pliki/katalogi w drastycznie innym miejscu, niż użytkownik oczekuje. Bez względu na to, jaki jest cel twojego programu, ale wyraź to z góry.

Odniesienia:

Powiązane problemy