파일을 읽고 쓰고 싶지만 다른 프로세스에서 삭제하거나 이름을 바꿀 수 있습니다. C#
에서 FileShare.Delete
으로 파일을 열 수 있습니까? 파이썬에는 이에 해당하는 것이 있습니까?Python 입출력은 열린 파일을 Windows에서 삭제하거나 이름을 바꿀 수 있습니까?
답변
크로스 플랫폼을 원한다면 ... 실제로는 그렇지 않습니다. 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 함수 중 일부만을 자동으로 파일 형태의 완전한 객체로 감싼다.
은 * 사실, 그들이 할 수있는 모든이 열린 디렉토리 엔트리 링크 해제 입니다. 해당 파일에 링크하는 유일한 디렉토리 항목 인 경우에도 파일 자체는 마지막 열린 핸들이 닫힐 때까지 계속 존재합니다.
- 1. Java 파일을 삭제하거나 이름을 바꿀 수 없습니다.
- 2. 파일을 삭제하거나 이름을 바꿀 수 없습니다.
- 3. Xcode 4.6 Project Navigator에서 파일을 삭제하거나 이름을 바꿀 수 없습니까?
- 4. Windows에서 열린 파일을 삭제할 수 있습니까?
- 5. Windows에서 여러 파일의 이름을 삭제하거나 편집 할 수 있습니까?
- 6. WebStorm에서 열린 파일의 이름을 어떻게 신속하게 바꿀 수 있습니까?
- 7. phpmyadmin의 데이터베이스에서 mySQL 덤프 파일을 삭제하거나 바꿀 수 있습니까?
- 8. Linux에서 열린 파일을 제거하거나 이름을 바꿀 수있는 이유는 무엇입니까?
- 9. Main.mxml의 이름을 바꿀 수 있습니까?
- 10. AndroidManifest.xml의 이름을 바꿀 수 있습니까?
- 11. Windows에서 프로세스에 의해 열린 파일을 삭제할 수 있습니까?
- 12. Nuget에서 폴더 이름을 바꿀 수 있습니까
- 13. Python3 venv : env 디렉토리의 이름을 바꿀 수 있습니까?
- 14. Basic4Android에서 디렉토리의 이름을 쉽게 바꿀 수 있습니까?
- 15. 열린 파일을 다시 읽습니다. Python
- 16. 사용자가 파일을 저장할 때 파일의 이름을 바꿀 수 있습니까? HTML
- 17. 파일이있는 폴더의 이름을 바꿀 수 있습니까?
- 18. VBA 코드를 통해 차트의 제목 이름을 삭제하거나 이름을 바꿀 수 없습니다.
- 19. Windows에서 Java 응용 프로그램의 "openwith"이름을 바꿀 수있는 방법이 있습니까?
- 20. 시스템 열린 파일 대화 상자를 바꿀 수 있습니까?
- 21. WebMatrix에서 사이트의 이름을 바꿀 수 있습니까?
- 22. 어떻게 mysql에서 데이터베이스의 이름을 바꿀 수 있습니까?
- 23. WEB-INF의 이름을 바꿀 수 있습니까?
- 24. Subversion 프로젝트의 이름을 안전하게 바꿀 수 있습니까?
- 25. 패키지 이름을 어떻게 바꿀 수 있습니까? IntelliJ
- 26. Rails에서 쉽게 URL의 이름을 바꿀 수 있습니까?
- 27. 보기의 열 이름을 바꿀 수 있습니까?
- 28. Xively 스트림 ID의 이름을 바꿀 수 있습니까
- 29. ct100이란 무엇이며 이름을 어떻게 바꿀 수 있습니까?
- 30. SSIS에서 디렉터리의 이름을 바꿀 수 있습니까?
* 이것은 Windows 관련 API 대신 stdio의 fopen과 같은 플랫폼 간 API를 사용하기 때문에 발생합니다 * 수정 될 가능성이 있습니다 - [기본 Windows API를 사용하여 새 io.FileIO 추가] (http : // bugs.python.org/issue12939).그런데 크로스 플랫폼 API를 사용하는 것이 크로스 플랫폼을 방지하는 방법은 흥미 롭습니다.) –
@PiotrDobrogost : 글쎄요, _Microsoft_와 같이 정확히 크로스 플랫폼이 될 수 있습니다. BTW, 3.x에서 파이썬은 stdio API보다는'open'과 같은 POSIX/MSVCRT API를 사용합니다. 이론적으로는 Win32 API 사용으로 변경하는 것이 더 쉬워야하지만 꽤 큰 변화입니다. fd를 어디서나 핸들로 대체 할 수 있고 MSVCRT가 fd의 상단에서 에뮬레이트하는 모든 것에 대한 새로운 코드를 작성하지 않는 한 드롭 인 대체가 아닌 파일 형식과 같은 형식 일 수 있습니다. 하지만 나는 아무도 PyPI를 별도의 유형을 놀라게 조금 놀랐어 ... – abarnert