Как проверить на блокировку файла? [дубликат]

Вот мои 3 цента ... Это демонстрирует явную сериализацию json для древовидного объекта python. Примечание. Если вам действительно нужен такой код, вы можете использовать класс twisted FilePath .

import json, sys, os

class File:
    def __init__(self, path):
        self.path = path

    def isdir(self):
        return os.path.isdir(self.path)

    def isfile(self):
        return os.path.isfile(self.path)

    def children(self):        
        return [File(os.path.join(self.path, f)) 
                for f in os.listdir(self.path)]

    def getsize(self):        
        return os.path.getsize(self.path)

    def getModificationTime(self):
        return os.path.getmtime(self.path)

def _default(o):
    d = {}
    d['path'] = o.path
    d['isFile'] = o.isfile()
    d['isDir'] = o.isdir()
    d['mtime'] = int(o.getModificationTime())
    d['size'] = o.getsize() if o.isfile() else 0
    if o.isdir(): d['children'] = o.children()
    return d

folder = os.path.abspath('.')
json.dump(File(folder), sys.stdout, default=_default)

246
задан Hossein Narimani Rad 30 April 2015 в 00:33
поделиться

6 ответов

Нет, к сожалению, и если бы Вы думаете об этом, та информация была бы бесполезна так или иначе, так как файл мог бы стать заблокированным очень в следующую секунду (чтение: короткий промежуток).

, Почему конкретно необходимо знать, заблокирован ли файл так или иначе? Знание, которое могло бы дать нам некоторый другой способ дать Вам хороший совет.

, Если Ваш код был бы похож на это:

if not locked then
    open and update file

Тогда между этими двумя строками, другой процесс мог легко заблокировать файл, дав Вам ту же проблему, которой Вы старались избегать для начала: исключения.

131
ответ дан angry person 23 November 2019 в 03:04
поделиться

Тогда между этими двумя строками, другой процесс мог легко заблокировать файл, дав Вам ту же проблему, которой Вы старались избегать для начала: исключения.

Однако этот путь, Вы знали бы, что проблема является временной, и повторить позже. (Например, Вы могли записать поток, который, при обнаружении с блокировкой при попытке записать, продолжает повторять, пока блокировки не не стало.)

IOException, с другой стороны, не отдельно достаточно конкретен, что блокировка является причиной отказа IO. Могли быть причины, которые не являются временными.

6
ответ дан Sören Kuklau 23 November 2019 в 03:04
поделиться

Вы видите, заблокирован ли файл путем попытки считать или заблокировать его сами сначала.

см. мой ответ здесь для получения дополнительной информации .

6
ответ дан Community 23 November 2019 в 03:04
поделиться

Вы можете вызвать LockFile через взаимодействие в интересующей вас области файла. Это не вызовет исключения, в случае успеха у вас будет блокировка в той части файла (которая удерживается вашим процессом) эта блокировка будет удерживаться до тех пор, пока вы не вызовете UnlockFile или пока ваш процесс не завершится.

7
ответ дан 23 November 2019 в 03:04
поделиться

Вместо использования interop вы можете использовать методы Lock и Unlock класса .NET FileStream:

FileStream.Lock http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx

FileStream.Unlock http://msdn.microsoft.com/en-us/library/system.io.filestream.unlock.aspx

15
ответ дан 23 November 2019 в 03:04
поделиться

Когда я столкнулся с подобной проблемой, я закончил со следующим кодом:

public bool IsFileLocked(string filePath)
{
    try
    {
        using (File.Open(filePath, FileMode.Open)){}
    }
    catch (IOException e)
    {
        var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1);

        return errorCode == 32 || errorCode == 33;
    }

    return false;
}
172
ответ дан 23 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: