2017-07-31 12 views
0

いくつかのディレクトリを繰り返し処理しようとしていますが、フォルダの合計サイズを返す必要があります。しかし、私は、コード内の関数を実行した後に、このエラー私のフォルダ内のサブディレクトリのいずれかでのファイルのいずれかの"OSError:[Errno 2]そのようなファイルまたはディレクトリが存在しません"

OSError: [Errno 2] No such file or directory: 

を取得します。関数がフォルダを反復処理しているのに、ファイルが存在しなければならないのに、なぜこのエラーが発生するのですか?

def get_size(folder): 
    folder_size = 0 
    for (path, dirs, files) in os.walk(folder): 
     for file in files: 
      filename = os.path.join(path, file) 
      folder_size += os.path.getsize(filename) 
    return folder_size 
+1

パスを検出してからそのサイズを確認するまでに時間がかかります。その間、パスは削除できます。パス*は有効ですが、有効であるとは限りません。 –

答えて

0

歩行中にこのエラーが発生する可能性が高い原因は、「ぶら下がっている」シンボリックリンク、つまりリンクターゲットが存在しないことです。あなたはダングリングリンクで何をしたいのかを決め、この問題を回避するには

  • はそれらを無視? os.path.islinkを使用して、ファイルがリンクかどうかを確認できます。
  • statの代わりにlstatを使用すると、リンクを解決しようとするのではなく、リンクのサイズがターゲットの長さになります。 os.path.getsize(filename)os.lstat(filename).st_sizeに置き換える必要があります。
+0

私はこのデータを抽出したいフォルダの大きなディレクトリを持っています。潜在的な修正は、 'folder'size + = os.path.getsize(filename)の前に' os.path.exists(path) 'をテストする' if'文を挿入するようなものを使用するでしょうか? – emillyrock

+0

@ ec197では、 'os.path.exists()'を実行すると存在する可能性がありますが、 'getsize()'を呼び出そうとするときは存在しません。例外を処理する方がいいです。 –

+0

競争条件は可能ですが、私は本当にこれが根本的な問題であるとは疑います。 try/exceptを使うだけでは、レースは完全には扱われません(ファイルサイズは歩行中に変更される可能性があります。たとえば、計算された 'folder_size'は正しくありません)。 – wim

関連する問題