Win32API ファイルサイズを切り詰める SetFilePointer SetEndOfFile

ファイルサイズを切り詰める

ちょうどLinuxでのtruncateシステムコールと同じような機能をWin32APIで実現する。


使用するAPI

  • SetFilePointer

  • SetEndOfFile
  • #include <windows.h>
    
    //ファイルサイズを切り詰める
    int main()
    {
    	HANDLE hFile;
    	int i;
    	BOOL bRet;
    	DWORD dwFileSize;
    	DWORD dwNumberOfReadBytes;
    	char *lpFileName = "test.txt";
    
    	//ファイルを開く
    	hFile = CreateFile(lpFileName,
    		GENERIC_READ | GENERIC_WRITE,
    		FILE_SHARE_READ | FILE_SHARE_WRITE,
    		NULL,
    		OPEN_ALWAYS,
    		FILE_ATTRIBUTE_NORMAL,
    		NULL);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		return 1;
    	}
    
    
    	//int型整数(4バイト)を10個(40バイト分)ファイルに書き込む
    	for (i = 0; i < 10; i++) {
    		
    		bRet = WriteFile(
    			hFile, 
    			&i, 
    			sizeof(i), 
    			&dwNumberOfReadBytes, 
    			NULL);
    
    		if (!bRet) {
    			goto Exit;	
    		}
    
    	}
    	
    	//ファイルサイズ表示
    	dwFileSize = GetFileSize(hFile, NULL);
    	printf("FileSize before SetEndOfFile = %u\n", dwFileSize);
    
    	//ファイルの先頭から20バイト目にシークする
    	SetFilePointer(hFile, sizeof(int)*5, NULL, FILE_BEGIN);
    	
    	//現在のファイルポインタにEOFをセットして
            //ファイルサイズを切り詰める
    	SetEndOfFile(hFile);
    	
    	//ファイルサイズを表示
    	dwFileSize = GetFileSize(hFile, NULL);
    	printf("FileSize before SetEndOfFile = %u\n", dwFileSize);
    
    Exit:	
    	//ファイルを閉じる
    	CloseHandle(hFile);
    
    	return 0;
    }