Форум сайта python.su
31
Требуется скопировать файл из кеша браузера, при этом он этим браузером и занят, убить процесс - пропадет и файл, система windows, не найду примеров как через api с помощью прямого доступа к диску скопировать файл , может кто сталкивался?
Офлайн
33
sanodin
Требуется скопировать файл из кеша браузера, при этом он этим браузером и занят, убить процесс - пропадет и файл, система windows, не найду примеров как через api с помощью прямого доступа к диску скопировать файл , может кто сталкивался?
Офлайн
31
не вывозит
shutil.copyfile(os.path.join(source_path, file_name),#копирование файла os.path.join(dest_path, file_name))
IOError: [Errno 13] Permission denied:
# -*- coding: UTF-8 -*- import win32file import os, sys homeDir = os.environ["USERPROFILE"] dest_path = homeDir + "\Desktop" path = homeDir+'\\AppData\Local\\Temp\\flaC08D.tmp' print "Path: "+path fileH = win32file.CreateFile( path, win32file.GENERIC_READ | win32file.GENERIC_WRITE, \ win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, \ None, # No special security requirements \ win32file.OPEN_EXISTING, # expect the file to exist. \ 0, # Not creating, so attributes dont matter. \ None ) # No template file result, msg = win32file.ReadFile(fileH, 1000, None)
Traceback (most recent call last): File "C:\Users\сан\Desktop\Python File (7).py", line 20, in <module> None ) # No template file error: (32, 'CreateFileW', "файл занят приложением"
Отредактировано sanodin (Дек. 6, 2013 21:21:35)
Офлайн
33
sanodin
не вывозит
Офлайн
31
сейчас пользую такой костыль
# -*- coding: utf8 -*- from os.path import join, getsize import os import fnmatch import shutil import time import subprocess import psutil #time.sleep(1) subprocess.Popen('sc start VSS' , shell = True)#запуск службы теневое копирование тома homeDir = os.environ["USERPROFILE"] dest_path = homeDir + "\\Desktop\\sinema\\" print (os.path.exists(homeDir+'\AppData\Local\Temp')) big_size = 100000#размер файла в байтах file_ext = '*.tmp'#расширение файлов для поиска path = homeDir+'\AppData\Local\Temp\\' #путь поиска вложенных файлов def copy(): for root, dirs, files in os.walk(path): for name in files: SizeFile = getsize(join(root, name)) if SizeFile> big_size: if fnmatch.fnmatch(name, file_ext): print (name, SizeFile) fs = (SizeFile/1024)/1024 print (fs, 'Mb') print (name.split('.')[-1]) r = os.path.splitext(name) fl = r[0] if fs > 1: subprocess.Popen(['hobocopy ' , path , dest_path+name], shell = False) #shutil.copyfile(os.path.join(path, name),#копирование файла #os.path.join(dest_path, fl + '.flv')) copy()
Отредактировано sanodin (Дек. 6, 2013 21:37:41)
Офлайн
33
sanodin
IOError: Permission denied:
Офлайн
31
полный доступ
Отредактировано sanodin (Дек. 6, 2013 20:19:24)
Офлайн
221
sanodinwinapi вам такую возможность не даст (имхо) ибо какая в таком случае воообще защита по типу разограничения прав может быть?
е найду примеров как через api с помощью прямого доступа к диску скопировать файл
Отредактировано JOHN_16 (Дек. 6, 2013 22:43:10)
Офлайн
31
JOHN_16windows 7
Правильный способ открыть физический диск на запись под Вистой таков: Шаг 1. Определяем список смонтированных разделов на этом физическом диске. Как? Ну, можно получить список всех томов в системе через FindFirstVolume/FindNextVolume/FindVolumeClose, далее открыть каждый из них и через IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS или IOCTL_STORAGE_GET_DEVICE_NUMBER выяснить номер объемлющего физического диска, и сравнить с номером физического диска, который мы хотим открыть на запись. Шаг 2. Размонтируем все найденные разделы, находящиеся на нашем физическом диске. Для этого их надо открыть на чтение-и-запись, с share mode, допускающим share read и share write, диспозиция - OPEN_EXISTING, и на каждом из них выполнить DeviceIoControl с кодами FSCTL_LOCK_VOLUME и FSCTL_DISMOUNT_VOLUME. Программисты-параноики, которые боятся скрытых разделов, которые смонтированы без присвоения буквы (и помешают прямому доступу к диску, если их так оставить), могут сделать перечисление всех объектов вида \Device\HardDiskN\PartitionM в пространстве имён NT Object Manager'а, и поразмонтировать их через NtCreateFile/NtDeviceIoControl, не связываясь с DOSоподобными буквами и Win32 API. Шаг 3. Наконец, открываем физический диск (CreateFile "\\.\PhysicalDriveN" или NtCreateFile "\Device\HardDiskN"). Режим - эксклюзивный (share mode = 0), права - чтение и запись, буферизация - выключена (FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH), диспозиция - OPEN_EXISTING. После открытия - опять FSCTL_LOCK_VOLUME и FSCTL_DISMOUNT_VOLUME (уже для всего физического диска в целом). Хендлы разделов диска не отпускаем, продолжаем удерживать их всех в заблокированном состоянии. Шаг 4. Работаем с диском. Читаем, пишем, всё что угодно. Шаг 5. FSCTL_UNLOCK_VOLUME и CloseHandle/NtClose для физического диска. Шаг 6. FSCTL_UNLOCK_VOLUME и CloseHandle/NtClose для каждого из бывших логических дисков. Шаг 7. Передёргиваем через Setup API storage driver физического диска, чтобы он в процессе переинициализации сообщил виндовому mount manager'у, о том, что у него новая таблица разделов. Это чтобы всем новым разделам были назначены новые Volume GUID'ы, а старые - "правильно" забыты. Любые отклонения от этой процедуры приводят к катастрофическим последствиям. Это вам не XPшка, где можно всё делать в любом порядке. Закроете хендлы логических разделов раньше времени (сразу после открытия физического) - винда перемонтирует логические диски, включит защиту области FATа и каталогов - и посыпятся рандомом ошибки - то ERROR_ACCESS_DENIED, то WriteFile возвращает нулевую длину без кода ошибки, то WriteFile вообще не возвращает ошибок, но данные на диск не пишутся. Это всё гонки (race condition) с FASTFAT.SYS и NTFS.SYS. А теперь, если внимательно и вдумчиво почитать KB 942448, то в хитросплетениях правил и ограничений, можно увидеть процедуру, которую я описал выше. Правда, здорово Майкрософт пишет мануалы?
Отредактировано sanodin (Дек. 7, 2013 07:18:02)
Офлайн
31
Видит файл но почему то читает не весь только вроде первую строку , а если файл текстовый то нормально читает
f = open(u'\\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy1\\Users\\сан\\AppData\\Local\\Temp\\fla14E5.tmp').read()
Отредактировано sanodin (Дек. 7, 2013 12:16:33)
Офлайн