簡単な方法はないようだ。このコードでも以下の問題がある。
- ファイルはグローバルリソースなのでこの関数が戻った時点で本当に開かれているのかどうかわからない。
- この関数は他のオープン操作を失敗させてしまう。
1 2 3 4 5 6 7 |
enum ISFILEOPEN { ISFILEOPEN_NO, ISFILEOPEN_YES, ISFILEOPEN_UNKNOWN, } ; ISFILEOPEN IsFileOpen(LPCTSTR pFile); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include #include "IsFileOpen.h" ISFILEOPEN IsFileOpen(LPCTSTR pFile) { HANDLE f = CreateFile( pFile, GENERIC_READ, 0, // share NULL, // sec OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(f==INVALID_HANDLE_VALUE) { switch(GetLastError()) { case ERROR_SHARING_VIOLATION:return ISFILEOPEN_YES; case ERROR_ACCESS_DENIED:return ISFILEOPEN_UNKNOWN; } return ISFILEOPEN_NO; } CloseHandle(f); return ISFILEOPEN_NO; } |