Próbuję utworzyć katalog z następującym kodem:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Jednak otrzymuję ten błąd:
Brak takiego pliku lub katalogu - / Users / Luigi / Desktop / Survey_Final / Archived / Survey / test (Errno :: ENOENT)
Dlaczego ten katalog nie jest tworzony za pomocą Dir.mkdir
powyższej instrukcji?
File.exists?()
działa na plikach i folderach. Nie zna różnicy.Odpowiedzi:
Prawdopodobnie próbujesz utworzyć zagnieżdżone katalogi. Zakładając,
foo
że nie istnieje, otrzymaszno such file or directory
błąd dla:Aby od razu utworzyć zagnieżdżone katalogi,
FileUtils
potrzebne są:Edit2: nie musisz używać
FileUtils
, możesz wykonać wywołanie systemowe (aktualizacja z @mu to zbyt krótki komentarz):Ale wydaje mi się to (przynajmniej dla mnie) tak samo gorsze podejście, jak użycie zewnętrznego „narzędzia”, które może być niedostępne w niektórych systemach (chociaż trudno sobie wyobrazić system bez
mkdir
, ale kto wie).źródło
system 'mkdir', '-p', 'foo/bar'
byłaby lepszą wersją tegosystem
wezwania. Nie ma potrzeby stosowania dodatkowego procesu powłoki ani zwykłego nonsensu dotyczącego cytowania / zmiany znaczenia / iniekcji, który pojawia się w wersji z pojedynczym argumentemsystem
.system
uruchomi się,/bin/sh
aby przeanalizowaćmkdir -p "foo/bar"
ciąg, a następnie uruchomi się powłoka/bin/mkdir
. Więc wykonujesz dodatkową pracę (utwórz ciąg polecenia, uruchom,/bin/sh
aby go ponownie rozdzielić), a część tej dodatkowej pracy pozostawia Cię otwartym na ataki polegające na wstrzykiwaniu powłoki (spędź trochę czasu w poradnikach CERT dla Rubiego, a zobaczysz, jak często ten problem jest).system
połączenie jest lepsze niżfileutils
ponownie? Jestem w systemie Windows imkdir_p
działa dobrze bez tworzenia podpowłoki tylko po to, aby przeanalizować,mkdir -p
co i tak by się nie udało. Cieszę się, żefileutils
to pierwsza alternatywa w odpowiedzi.fileutils
lubmkdir_p
, mówię tylko, żesystem command, arg1, arg2, ...
jest lepsze niżsystem command_with_arguments
.Prosta droga:
źródło
Inny prosty sposób:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
źródło
/home/jignesh/reports/test
ale podniesiono użycie tego rozwiązaniaRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Więc niezawodnym rozwiązaniem jest użycieFileUtils.mkdir_p
A może po prostu
Dir.mkdir('dir') rescue nil
?źródło
rescue
w formie modyfikatora.