Вот мои 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)
Нет, к сожалению, и если бы Вы думаете об этом, та информация была бы бесполезна так или иначе, так как файл мог бы стать заблокированным очень в следующую секунду (чтение: короткий промежуток).
, Почему конкретно необходимо знать, заблокирован ли файл так или иначе? Знание, которое могло бы дать нам некоторый другой способ дать Вам хороший совет.
, Если Ваш код был бы похож на это:
if not locked then
open and update file
Тогда между этими двумя строками, другой процесс мог легко заблокировать файл, дав Вам ту же проблему, которой Вы старались избегать для начала: исключения.
Тогда между этими двумя строками, другой процесс мог легко заблокировать файл, дав Вам ту же проблему, которой Вы старались избегать для начала: исключения.
Однако этот путь, Вы знали бы, что проблема является временной, и повторить позже. (Например, Вы могли записать поток, который, при обнаружении с блокировкой при попытке записать, продолжает повторять, пока блокировки не не стало.)
IOException, с другой стороны, не отдельно достаточно конкретен, что блокировка является причиной отказа IO. Могли быть причины, которые не являются временными.
Вы видите, заблокирован ли файл путем попытки считать или заблокировать его сами сначала.
см. мой ответ здесь для получения дополнительной информации .
Вы можете вызвать LockFile через взаимодействие в интересующей вас области файла. Это не вызовет исключения, в случае успеха у вас будет блокировка в той части файла (которая удерживается вашим процессом) эта блокировка будет удерживаться до тех пор, пока вы не вызовете UnlockFile или пока ваш процесс не завершится.
Вместо использования 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
Когда я столкнулся с подобной проблемой, я закончил со следующим кодом:
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;
}