2014-07-09 4 views
0

kernel32.dll을 사용하여 파일을 읽어야합니다. CreateFile, SetFilePointer 및 ReadFile 메서드에 대해 읽었습니다 (필자는이 메서드를 사용해야합니다). 그러나이를 적용하는 방법을 모르겠습니다.kernel32.dll (파이썬) 파일 읽기

앞서 언급했듯이 at msdn 모든 인수를 지정해야합니다. 처음에는 파일 경로이지만 다른 인수는 무엇인지, 그리고 어떤 방법으로 삽입해야하는지 전혀 알지 못합니다.

누구나 kernel32.dll CreateFile, SetFilePointer 및 ReadFile에서 "howto"를 도울 수 있습니까?

정말 감사드립니다.

업데이트

내가 KERNEL32를 사용하려고하는 이유는 내가 플래시 드라이브에서 읽을 수있는 정말 - 정말 빠른 방법이 필요하다는 것입니다. 파일 시스템에서 시간을 보내지 않고 플래시에서 직접 읽을 수있는 방법이 필요합니다. 이것은 필자가 파일 시스템에서 긴 검색을하지 않고도 필요한 바이트에 직접 액세스한다는 것을 의미합니다.

여기

입니다 코드는 내가이 코드는 기가 USB를 통해 파일 하나를 찾기 위해 약 8 분 정도 걸립니다

index = 524288 
    data = open('Path-to-file', 'rb') 
    while index < file_length: 
     data.seek(index) 
     headers.append((index, data.read(128))) 
     index += cluster 
    data.close() 

를 읽는 데 사용.

4 분에 완료해야합니다.

누군가 다른 방법으로 할 수있는 제안이 있다면 - 정말 고맙겠습니다.

이 같은 win32file (pywin32를) 시도

업데이트 : 그것은 파이썬보다 더 많은 시간 (12 분) 소요

def get_headers(self): 
    while self.index < self.file_len: 
     handle = win32file.CreateFile(self.path, win32file.GENERIC_READ, 
             win32file.FILE_SHARE_READ, None, 
             win32file.OPEN_EXISTING, 
             win32file.FILE_ATTRIBUTE_NORMAL, None) 
     win32file.SetFilePointer(handle, self.index, win32file.FILE_CURRENT) 
     header_ = win32file.ReadFile(handle, 128, None) 
     header = header_[1] 
     self.headers.append((self.index, header)) 
     self.index += cluster 
     win32file.CloseHandle(handle) 

"추구"와 기능 "읽기". Windows dll에 대한 모듈 사용이 읽기 시간을 늘리는 이유를 아는 사람 있습니까?

+0

플래시 드라이브가 파일 시스템을 사용하지 않습니까? –

+0

드라이브의 원시 바이트에 액세스하거나 파일의 위치를 ​​탐색하려고합니까? (원시 수준 인 경우 상위 수준 인터페이스가 도움이되는지 확신 할 수 없음). 파일 내에 있으면 파이썬 코드를 사용하십시오. 기본 파일 액세스는 아마도 C 기반이며 더 낮은 수준의 언어로 가지 않고도 얻을 수있는 속도만큼 빠릅니다. 또한 엄지 드라이브의 파일 시스템은 무엇입니까? – dhj

+0

파일 시스템은 FAT32입니다.여기 내가 뭘하려고하는지 : 원시 바이트가있는 이진 파일이 있습니다. 각 클러스터의 시작 부분에서 헤더를 읽고 저장해야합니다. C로 쓰기 ** 읽기 ** 시도해 볼만한 가치가 있습니까? – Julia

답변

0

여기 CreateFile의 가장 일반적인 사용의 :

hFile = CreateFile("file.txt", GENERIC_READ, 0, 0, 3, 128, None) 

그리고 ReadFile :

ReadFile(hFile, pOutput, nNumberOfBytesToRead, lpNumberOfBytesRead, 0) 

참고가 ctypes를 사용하는 경우, 당신은 pOutput에 대한 (문자열을 나타내는) c_char_p이 필요합니다, 그 (파일 내용이 저장되는 곳), lpNumberOfBytesRead의 경우 byref 또는 pointer입니다.

나는 더 간단 할 pywin32을 사용할 수도 있습니다.

희망이 도움이됩니다.

+0

'CreateFile' 함수는 어떻게 지정해야합니까? 나는 이것을 시도했지만 작동하지 않는다 :'kernel = ctypes.windll.kernel32'; 'handle = kernel.CreateFileW (self.path, kernel.GENERIC_READ, kernel.FILE_SHARE_READ, 없음, kernel.OPEN_EXISTING, kernel.FILE_ATTRIBUTE_NORMAL, 없음) ' – Julia

+0

그게 효과가있다. 'CreateFileW'를 사용하고 있다면,'self.path'가 유니 코드 문자열인지 확인하십시오. 'GetLastError'를 사용하여 어떤 일이 일어나고 있는지 확인할 수도 있습니다. – cdonts

+0

우선,'GENERIC_READ'가 커널에서 발견되지 않는다는 오류가 있습니다. 그래서 난 그냥 이런 식으로 사용할 수 없다. – Julia