Как заставить скрипт закрыть все открытые файлы на основе их каталога? - PullRequest
0 голосов
/ 25 января 2019

Можно ли закрыть открытые файлы, основываясь только на их каталогах?Я хотел бы закрыть файлы с определенным расширением.Если это невозможно, я могу закрыть все открытые файлы.Мой код стал настолько длинным, что я не могу контролировать закрытие файлов другим способом.Я готовлю приложение для внешних пользователей и разработал кнопку «Сброс», но у меня возникла проблема с доступом к какой-либо папке, поскольку эти файлы все еще открыты.

Я использую psutil для получения списка всех открытых файлов по моему сценарию .py.

[popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_48.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.shp', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\explorerframe.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\polygonSet1B.shp', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_idx.db', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\user32.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\thumbcache_idx.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.shx', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\PolygonSet1A.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\obszar_zainteresowania.dbf', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\dui70.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\polygonSet1B.dbf', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\shell32.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\propsys.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\thumbcache_96.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\obszar_zainteresowania.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\NetworkItemFactory.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\comdlg32.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\Fonts\\StaticCache.dat', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_256.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\PolygonSet1A.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\windows.storage.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.shx', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\mpr.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\KernelBase.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_16.db', fd=-1)]    

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

Тогда пришло время остановить все и исправить ваш код. На самом деле, ваш код ДОЛЖЕН закрывать каждый файл, как только он будет сделан с ним ( оператор with здесь ваш друг ), и мне трудно придумать причину сохранения такого количества файлов в все равно один раз.

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

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

0 голосов
/ 25 января 2019

Вы можете проверить каталог и расширение, используя встроенную библиотеку os.path или симпатичный path.py .

for fname in my_files:
    _, ext = os.path.splitext(fname)
    dirname = os.path.join(fname, os.pardir)

    if ext=".txt" and dirname ="my_dir":
        # close your file

Или с помощью path.py:

for fname in my_files:
    fname = Path(fname)
    if fname.ext == ".txt" and fname.parent == "my_dir":
        # close your file
...