Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2013 18:28:40

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

Требуется скопировать файл из кеша браузера, при этом он этим браузером и занят, убить процесс - пропадет и файл, система windows, не найду примеров как через api с помощью прямого доступа к диску скопировать файл , может кто сталкивался?

Офлайн

#2 Дек. 6, 2013 19:40:51

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

sanodin
Требуется скопировать файл из кеша браузера, при этом он этим браузером и занят, убить процесс - пропадет и файл, система windows, не найду примеров как через api с помощью прямого доступа к диску скопировать файл , может кто сталкивался?

А что, shutil.copy не вариант?



Офлайн

#3 Дек. 6, 2013 19:42:18

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

не вывозит

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)

Офлайн

#4 Дек. 6, 2013 19:52:10

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

sanodin
не вывозит

Что пишет-то?



Офлайн

#5 Дек. 6, 2013 19:58:19

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

сейчас пользую такой костыль

# -*- 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)

Офлайн

#6 Дек. 6, 2013 19:59:19

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

sanodin
IOError: Permission denied:

Задай права доступа к каталогу, где кеш browser лежит



Офлайн

#7 Дек. 6, 2013 20:02:58

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

полный доступ

Отредактировано sanodin (Дек. 6, 2013 20:19:24)

Офлайн

#8 Дек. 6, 2013 22:32:31

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

sanodin
е найду примеров как через api с помощью прямого доступа к диску скопировать файл
winapi вам такую возможность не даст (имхо) ибо какая в таком случае воообще защита по типу разограничения прав может быть?

Добавлено: у меня на WinXP в общем то всегда читались файлы занятые другими приложениями, м.б. дело все таки в Win что у вас стоит?или м.б. в болеее поздних ос что то поменялось в этом плане



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Дек. 6, 2013 22:43:10)

Офлайн

#9 Дек. 7, 2013 06:26:16

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

JOHN_16
windows 7
http://support.microsoft.com/kb/100027/ru

если блокнотом файл открыт , то и читается и даже перемещается, а браузер занял и не отдает)

и вот еще что пишут про vista
Правильный способ открыть физический диск на запись под Вистой таков:
Шаг 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)

Офлайн

#10 Дек. 7, 2013 11:59:23

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Копирование файла занятого приложением

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

f = open(u'\\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy1\\Users\\сан\\AppData\\Local\\Temp\\fla14E5.tmp').read()

Отредактировано sanodin (Дек. 7, 2013 12:16:33)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version