// File64.h: CFile64 クラスのインターフェイス // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_FILE64_H__F0029628_60C7_4586_8446_24AAABA6944D__INCLUDED_) #define AFX_FILE64_H__F0029628_60C7_4586_8446_24AAABA6944D__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CFile64 { public: HANDLE hFile;//ファイルハンドル CFile64(){ hFile=NULL; } CFile64(const char*lpFileName,DWORD flag){ Open(lpFileName,flag); } virtual ~CFile64() { Close(); } //enum定義 enum OpenFlags { modeRead = 0x0000, modeWrite = 0x0001, modeReadWrite = 0x0002, shareCompat = 0x0000, shareExclusive = 0x0010, shareDenyWrite = 0x0020, shareDenyRead = 0x0030, shareDenyNone = 0x0040, modeNoInherit = 0x0080, modeCreate = 0x1000, modeNoTruncate = 0x2000, typeText = 0x4000, typeBinary = (int)0x8000 }; enum Attribute { normal = 0x00, readOnly = 0x01, hidden = 0x02, system = 0x04, volume = 0x08, directory = 0x10, archive = 0x20}; enum SeekPosition { begin = 0x0, current = 0x1, end = 0x2 }; //オープン //CFile互換のオープン 引数などはCFile参照 BOOL Open(const char*lpFileName,DWORD nOpenFlags){ DWORD a=GENERIC_READ,b=0,c=OPEN_EXISTING,d=0; if((nOpenFlags & modeWrite)) a+=GENERIC_WRITE; if((nOpenFlags & modeReadWrite)) a+=GENERIC_WRITE; if((nOpenFlags & shareDenyWrite)) b+=FILE_SHARE_READ; if((nOpenFlags & shareDenyRead)) b+=FILE_SHARE_WRITE; if((nOpenFlags & shareDenyNone)) b+=(FILE_SHARE_WRITE|FILE_SHARE_READ); if((nOpenFlags & modeCreate)) c=CREATE_NEW; if((nOpenFlags & modeNoTruncate)) c=OPEN_ALWAYS; Close(); return Open(lpFileName, a, b, NULL, c); } //CreateFile互換のオープン 引数などは CreateFile参照 BOOL Open(const char*lpFileName ,DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes=NULL, DWORD dwCreationDisposition=OPEN_EXISTING, DWORD dwFlagsAndAttributes=FILE_ATTRIBUTE_ARCHIVE, HANDLE hTemplateFile=NULL){ Close(); hFile = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); if(hFile==INVALID_HANDLE_VALUE) return FALSE; return TRUE; } //簡潔に開くために作った関数 //openexist=FALSE : ファイルがない場合生成しファイルを開く // TRUE : ファイルがない場合は生成せずに終わる BOOL Openm(const char*lpFileName,BOOL openexist=TRUE){//短くFALSEでファイルが無いときも作成してオープン if(openexist==TRUE) return Open(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL); else return Open(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS); } int Read(void* buf,DWORD len){//読み込み DWORD lenb; BOOL r=ReadFile(hFile,buf,len,&lenb,NULL); if(r==0) return 0; return lenb; } int Write(void* buf,DWORD len){//書き込み DWORD lenb; BOOL r=WriteFile(hFile,buf,len,&lenb,NULL); if(r==0) return 0; return lenb; } __int64 Seek(__int64 len,DWORD f){//シーク LARGE_INTEGER li; li.QuadPart = len; li.LowPart = SetFilePointer (hFile, li.LowPart, &li.HighPart, f); if (li.LowPart == -1 && GetLastError() != NO_ERROR){ li.QuadPart = -1; } return li.QuadPart; } void SeekToBegin() { Seek(0,FILE_BEGIN); }//シーク頭へ void SeekToEnd() { Seek(0,FILE_END); }//シーク最後へ __int64 GetLength() {//長さを獲得 LARGE_INTEGER li; li.LowPart=GetFileSize(hFile,(DWORD*)&li.HighPart); return li.QuadPart; } __int64 GetPosition(){//現在の位置を獲得 LARGE_INTEGER li; li.LowPart = ::SetFilePointer((HANDLE)hFile, 0, (long*)&li.HighPart, FILE_CURRENT); return li.QuadPart; } void Flush() { if(hFile==NULL) return; FlushFileBuffers(hFile); } void Close() {//閉じる if(hFile!=0) CloseHandle(hFile); hFile=0; } //以下スタティック関数 //使用方法は CFile64::Rename( ... ) という具合に直接実行 //ファイルまたはフォルダに対して有効 //戻り値 FALSE:正常終了 それ以外:異常終了 static BOOL Rename(HWND h,CString oldname,CString newname){//リネーム SHFILEOPSTRUCT Op; ZeroMemory( &Op,sizeof(SHFILEOPSTRUCT)); Op.hwnd = h; // 実行するウインドウのハンドル Op.wFunc = FO_RENAME; // リネーム Op.pFrom = oldname; Op.pTo = newname; Op.fFlags = FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_SILENT|FOF_NOERRORUI; return SHFileOperation( &Op ); } static BOOL Copy(HWND h,CString oldname,CString newname){//コピー SHFILEOPSTRUCT Op; ZeroMemory( &Op,sizeof(SHFILEOPSTRUCT)); Op.hwnd = h; // 実行するウインドウのハンドル Op.wFunc = FO_COPY; // コピー Op.pFrom = oldname; Op.pTo = newname; Op.fFlags = FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_SILENT|FOF_NOERRORUI; return SHFileOperation( &Op ); } static BOOL Move(HWND h,CString oldname,CString newname){//移動 SHFILEOPSTRUCT Op; ZeroMemory( &Op,sizeof(SHFILEOPSTRUCT)); Op.hwnd = h; // 実行するウインドウのハンドル Op.wFunc = FO_MOVE; // 移動 Op.pFrom = oldname; Op.pTo = newname; Op.fFlags = FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_SILENT|FOF_NOERRORUI; return SHFileOperation( &Op ); } static BOOL Delete(HWND h,CString deletename){//削除 SHFILEOPSTRUCT Op; ZeroMemory( &Op,sizeof(SHFILEOPSTRUCT)); Op.hwnd = h; // 実行するウインドウのハンドル Op.wFunc = FO_DELETE; // 削除 Op.pFrom = deletename; Op.fFlags = FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_SILENT|FOF_NOERRORUI; return SHFileOperation( &Op ); } }; #endif // !defined(AFX_FILE64_H__F0029628_60C7_4586_8446_24AAABA6944D__INCLUDED_)