13

私の目標は、ファイルにアクセスできない場合でも、ファイルが別のプロセスによってロックされているかどうかを知ることです。

より明確にするために、Pythonの組み込みのスイッチopen()付き(書き込み用)を使用してファイルを開いているとしましょう。次の場合にスローします:'wb'open()IOErrorerrno 13 (EACCES)

  1. ユーザーにファイルへのアクセス許可がない、または
  2. ファイルは別のプロセスによってロックされています

ここでケース(2)を検出するにはどうすればよいですか?

(私のターゲットプラットフォームはWindowsです)

4

3 に答える 3

6

os.accessアクセス許可の確認に使用できます。アクセス許可が適切である場合、それは2番目のケースである必要があります。

于 2012-11-14T00:58:45.320 に答える
5

以前のコメントで示唆されているようにos.access、正しい結果を返しません。

しかし、私はオンラインで機能する別のコードを見つけました。秘訣は、ファイルの名前を変更しようとすることです。

差出人:https ://blogs.blumetech.com/blumetechs-tech-blog/2011/05/python-file-locking-in-windows.html

def isFileLocked(filePath):
    '''
    Checks to see if a file is locked. Performs three checks
        1. Checks if the file even exists
        2. Attempts to open the file for reading. This will determine if the file has a write lock.
            Write locks occur when the file is being edited or copied to, e.g. a file copy destination
        3. Attempts to rename the file. If this fails the file is open by some other process for reading. The 
            file can be read, but not written to or deleted.
    @param filePath:
    '''
    if not (os.path.exists(filePath)):
        return False
    try:
        f = open(filePath, 'r')
        f.close()
    except IOError:
        return True

    lockFile = filePath + ".lckchk"
    if (os.path.exists(lockFile)):
        os.remove(lockFile)
    try:
        os.rename(filePath, lockFile)
        sleep(1)
        os.rename(lockFile, filePath)
        return False
    except WindowsError:
        return True
于 2020-09-06T05:56:59.990 に答える
3

ドキュメントによると:

errno.EACCES
    Permission denied
errno.EBUSY

    Device or resource busy

だからこれを行うだけです:

try:
    fp = open("file")
except IOError as e:
    print e.errno
    print e

そこからerrnoコードを理解すれば、準備は完了です。

于 2012-11-14T00:59:05.430 に答える