22

次のエラーが発生します。

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

存在しないディレクトリにファイルをダウンロードしようとしたとき。

例えば:

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

ただし、ダウンロードするファイルの多くでは、完全なディレクトリパスは存在しません。たとえば、最初のファイルがpubを作成するまで、それは存在せず、これはlang / ruby​​/contribにも当てはまります。

ディレクトリが存在するかどうかを確認し、存在しない場合は作成する方法はありますか?存在することは知っていますか?しかし、それは参照ファイルを参照し、フルパスを作成しません。ファイル名に到達するまでフォルダ構造をトラバースするには、再帰的な方法が必要だと思います。

編集:mkdir_pはまさに私が必要とする解決策のようです。

ただし、「/ a / b / c」のパスを使用すると、FileUtils.mkdir_p(File.dirname(localdir))がエラーを返すことに気付きました:Errno :: EACCES:Permission denied-/ a

前の「/」を手動で削除すると機能します。これを引き起こしているのは何ですか?エラーを解決するための最良の解決策は何ですか?次のものを使用する必要がありますか?

 path="/a/b/c"
 if path[0]="/"
    path=path[1..-1]
 end

しかし、これは単なるハックのように感じます。

4

4 に答える 4

20

存在しないパスに保存することはできません。開発者は、ファイルを保存する前に、宛先パスが存在することを確認する必要があります。

Rubyには、ファイルまたはディレクトリの存在を確認できるメソッドがあります。

FileUtils.makedirs()mkpath、、およびのエイリアスmkdir_pです。makedirsニーモニックなので好きです。

これらも役立ちます:

Dir.chdirブロックがかかるので、これら2つの間で私は好みます。そのブロック内で発生するアクションはすべて、変更したディレクトリで発生します。終了時に、ディレクトリは以前の状態に戻ります。

于 2013-03-25T03:03:47.540 に答える
4

* nix mkdir -p、mkdir_pの類似物は、他の2つの回答で提供された必要なものですが、アクセス許可に関する編集に対処する人は誰もいませんでした。

解決策は、スクリプトを呼び出すユーザーがルートディレクトリへの書き込み権限を必要とすることです。

パス"/a / b / c"は、ルートパス( "/")をアドレス指定しています。これは通常、rootユーザーまたはsudoアクセス権を持つユーザーのみが書き込みアクセス可能です。

パスを変更して先頭の「/」を削除すると、ルートディレクトリではなく現在の作業ディレクトリを基準にしてディレクトリ「a / b/c」を作成するようにmkdir_pに指示しました。変更されたバージョンが機能する理由は、rubyスクリプトを呼び出すユーザーが、現在の作業ディレクトリへの書き込み権限を持っているためです。

個人的には、スクリプトの利用者がパス入力を提供している場合は、ユーザーが期待する場所とは大幅に異なる場所にファイル/ディレクトリを作成する可能性があるため、先頭のスラッシュを削除したくないでしょう...それがない限りプログラムの目的ですが、事前に明確にしてください。

参照:

于 2015-07-01T18:56:34.357 に答える
2

gemをインストールしたのに、ファイルがマシンにインストールされなかったため、ここに到着しました。私の場合、gem espeak-rubygemをインストールしましたが、Macにインストールされていなかったので、簡単なbrew install espeakコマンドでインストールしてサーバーを再起動しました。すべてが正しくインストールされていることを確認することをお勧めします。

于 2019-10-29T02:58:01.657 に答える
1

fileutilsモジュールでは、フルパスがまだ存在しない場合にフルパスを作成するコマンドmkdir_pと同様に使用できます。mkdir -p

于 2013-03-25T00:19:33.963 に答える