2017-09-07 3 views
3

stat.pyos.statで報告されているst_mode(整数)から、よく知られている "文字列"形式(この表現には適切な名前があるかどうかはわかりません)になるためにはa helper functionです。'-rw-r-r--'から33188に戻る方法は?

>>> stat.filemode(0o100644) 
'-rw-r--r--' 

逆のヘルパー機能はありますか?

これは私が試したものですが、間違った結果が出ています。これは、Pythonはオープンソースである

table = {ord('r'): '1', ord('w'): '1', ord('-'): '0'} 

def filemode_inv(s): 
    return int(s.translate(table), 2) 
+0

あなたは文字列を取得していますが、その代わりに代わりの形式を提供できますか? – chepner

答えて

2

を正しく最初の文字表すのファイルタイプを処理していない、となどスティッキービットを処理していない、あなただけのstatモジュールのソースコードを読んで、逆関数を書くことができます。

参照:私は "いたずら" であるとstatモジュールのプライベートメンバーにアクセスしていhttps://github.com/python/cpython/blob/master/Lib/stat.py#L112

import stat 

def un_filemode(mode_str): 
    mode = 0 
    for char, table in zip(mode_str, stat._filemode_table): 
     for bit, bitchar in table: 
      if char == bitchar: 
       mode |= bit 
       break 
    return mode 

注意。通常の警告が適用されます。

0o100000は技術的にファイルモードの一部ではないため、S_IFREGのファイルタイプであるため、stat.filemodeのマニュアルは間違っています。 inode(7)から:

POSIXマスクS_IFMTに対応stat.st_modeビットに、ファイルタイプとして(下記参照)を指すファイル・モード・ビットとしてマスク07777に対応する12ビットと下位9ビット(0777)をファイル許可ビットとして使用します。

+0

私のプラットフォームでは、Pythonのfilemode実装は、C実装の[* import](https://github.com/python/cpython/blob/1f06a680de465be0c24a78ea3b610053955daa99/Lib/stat.py#L176)によって吹き飛ばされています。各実装の動作は多少異なります。 Go figure .. – wim

+0

@wim:Pythonコードでは正しく動作しないので、正しく動作する理由を説明します。 –

関連する問題