2013-10-09 1 views

답변

6

크로스 플랫폼을 원한다면 ... 실제로는 그렇지 않습니다. POSIX 시스템에서 다른 프로세스는 사용자가 방해하지 않는 한 열려있는 파일을 항상 삭제하거나 이름을 바꿀 수 있습니다 *. 따라서 Windows에서만이 작업을 수행하면 거의 모든 작업을 수행 할 수 있습니다.

파이썬의 표준 파일 객체를 사용하면 Windows 공유 플래그를 직접 제어 할 수 없습니다. (이는 Windows 관련 API가 아닌 stdio의 fopen과 같은 플랫폼 간 API를 사용하기 때문입니다.)

다른 파일 기능을 호출해야합니다.

IronPython에서는 물론 C#에서 호출하는 것과 동일한 .NET 함수를 호출 할 수 있습니다.

CPython에서 CPython은 기본 Win32 응용 프로그램이므로 .NET을 사용할 수 없습니다. 즉, CreateFile으로 전화해야합니다. pywin32 패키지를 사용하면이 작업을 더 쉽게 수행 할 수 있지만 여전히 다소 어려움이 있습니다.

대신 단지 f = open(path, 'r+')

, 당신은 (안된)이 같은 필요 : 그냥 그것을 고집하는 대신,

buflen, buf = win32file.ReadFile(f, 4096, None) 

을 그리고 : 다음

f = win32file.CreateFile(path, 
         win32con.GENERIC_READ | win32con.GENERIC_WRITE, 
         win32con.FILE_SHARE_DELETE, 
         None, 
         0, 
         win32con.OPEN_ALWAYS, 
         None) 

그리고, 대신 buf = f.read(4096)의를, 당신이 할

win32file.CloseFile(f) 
하십시오 with 문, 당신과 함께, 명시 적으로 닫을 필요

많은 일을 할 계획이라면 파일과 비슷한 객체에 win32file 핸들을 래핑하는 것은 그다지 어렵지는 않을 것입니다.

가장 까다로운 비트는 open의 인수에 얼마나 근접해 있고 코드를 작성하여 값을 CreateFile이 원하는 것으로 변환할지 결정하는 것입니다. (Win32 기본 파일이 Win32 stdio 파일과 다르게 처리하는 몇 가지 모서리 사례가 있지만 보통 비트가 없습니다.)

io 모듈을 보면서 방금 구현 한 도우미를 볼 수도 있습니다 원시 open/read/write/close 함수 중 일부만을 자동으로 파일 형태의 완전한 객체로 감싼다.


은 * 사실, 그들이 할 수있는 모든이 열린 디렉토리 엔트리 링크 해제 입니다. 해당 파일에 링크하는 유일한 디렉토리 항목 인 경우에도 파일 자체는 마지막 열린 핸들이 닫힐 때까지 계속 존재합니다.

+0

* 이것은 Windows 관련 API 대신 stdio의 fopen과 같은 플랫폼 간 API를 사용하기 때문에 발생합니다 * 수정 될 가능성이 있습니다 - [기본 Windows API를 사용하여 새 io.FileIO 추가] (http : // bugs.python.org/issue12939).그런데 크로스 플랫폼 API를 사용하는 것이 크로스 플랫폼을 방지하는 방법은 흥미 롭습니다.) –

+0

@PiotrDobrogost : 글쎄요, _Microsoft_와 같이 정확히 크로스 플랫폼이 될 수 있습니다. BTW, 3.x에서 파이썬은 stdio API보다는'open'과 같은 POSIX/MSVCRT API를 사용합니다. 이론적으로는 Win32 API 사용으로 변경하는 것이 더 쉬워야하지만 꽤 큰 변화입니다. fd를 어디서나 핸들로 대체 할 수 있고 MSVCRT가 fd의 상단에서 에뮬레이트하는 모든 것에 대한 새로운 코드를 작성하지 않는 한 드롭 인 대체가 아닌 파일 형식과 같은 형식 일 수 있습니다. 하지만 나는 아무도 PyPI를 별도의 유형을 놀라게 조금 놀랐어 ... – abarnert

관련 문제