2011-01-30 7 views
1

私は2つのパスを持っているとしましょう:最初のパス(ファイルまたはフォルダのパス):file_pathと2番目のパス(フォルダパスのみ):folder_path。そして、file_pathと一緒に配置されたオブジェクトがfolder_pathと一緒に配置されたオブジェクトの内部にあるかどうかを調べたいと思います。指定されたファイルが指定されたフォルダの中に置かれているかどうかを確認するには?

は、私がこれを行うためのアイデアがあります

import os 
... 
def is_inside(file_path, folder_path): 
    full_file_path = os.path.realpath(file_path) 
    full_folder_path = os.path.realpath(folder_path) 
    return full_folder_path.startswith(full_file_path) 

を、私は、このアプローチでは、いくつかの落とし穴があるんです。また、これを行うにはもっときれいな方法が必要だと思います。

解決策はLinux上で動作する必要がありますが、いくつかのクロスプラットフォームのトリックを提案していただければ幸いです。

答えて

1

使用os.path.commonprefixを行います。あなたのアイディアに基づいた例があります。

import os.path as _osp 

def is_inside(file_path, folder_path): 
    full_file_path = _osp.realpath(file_path) 
    full_folder_path = _osp.realpath(folder_path) 
    return _osp.commonprefix([full_file_path, full_folder_path]) == \ 
      full_folder_path 
+0

さて、私の質問で提案したのとまったく同じものではありませんか? – ikostia

+0

@ikostia - はい、いいえ。 Linux(そしておそらくWindows上)では、 'commonprefix'は最も長い開始部分文字列を照合することで実装できます。しかし、プラットフォームがあれば、何らかの理由でPythonが動作しないところでPythonが実装されていると、 'commonprefix'は引き続き動作します。あなたは、あなたが心配していた落とし穴の種類については、あまり特定されませんでした。あなたがより具体的であれば、私はあなたに良い答えを与えることができます。 – Omnifarious

+0

まあ、私は開発時に見逃すことができる様々な落とし穴を意味しました。私はちょうど別の人がこの問題をはるかに違う形で解決し、彼の選択を私に説明するかもしれないと思った。しかし、今私はそれがおそらく私がやりたいことをするための最善の方法だと思っています。 – ikostia

0

は、ファイルパスからファイル名を解析し、

os.path.exists(full_folder_path + '/' + file_name) 
+0

'/home/ikostia/1.txt'が '/ home'の内側にあるかどうかを確認したい場合は動作しません。正しい答えが真である間、あなたのアルゴリズムはfalseを返します。 – ikostia

関連する問題