Get File Size

윈도우즈에서 파일 사이즈를 구해 보자.

< stat를 이용한 방법 >

#include <sys/types.h>

#include <sys/stat.h>

__int64 GetFileSize64( const char * szFileName)

{

    struct __stat64 fileStat;

    int err = _stat64( szFileName, &fileStat );

    if(err != 0)

        return 0;

 

    return fileStat.st_size;

}

 

< GetFileAttributesEx를 이용한 방법 >

__int64 GetFileSize(const char *path)

{

    WIN32_FILE_ATTRIBUTE_DATA attr = { 0 };

    if( !::GetFileAttributesEx(path, GetFileExInfoStandard, &attr))

        return 0;

 

    __int64 fileSize = 0;

    fileSize = attr.nFileSizeHigh;

    fileSize <<= 32;

    fileSize += attr.nFileSizeLow;

    return fileSize;

}

 

< ftell을 사용한 방법 >

long GetFileSize( const std::string path )

{

    FILE *pFile = NULL;

 

    fopen_s( &pFile, path.c_str(), "rb" );

    fseek( pFile, 0, SEEK_END );

 

    long size = ftell( pFile );

 

    //파일을 읽기를 원하면 파일 포인터를 시작점으로 돌린다

    // rewind( pFile );

 

    fclose( pFile );

    return size;

}

파일 사이즈를 얻어온 후 바로 파일 읽기를 할려면 rewind를 실행한다.

 

< FindFirstFile을 이용하는 방법 >

ULONGLONG GetFileSizeEx( const std::string& strPath )

   WIN32_FIND_DATA FindData = { 0 };

   //gets a file search handle

   HANDLE hFirstFile = FindFirstFile( strPath.c_str(), &FindData ); 

 

   //if the handle is valid

   if( hFirstFile != INVALID_HANDLE_VALUE )

   {

      //closes the file search handle

      FindClose( hFirstFile );

 

      ULONGLONG FileSize = FindData.nFileSizeHigh;

      FileSize <<= sizeof( FindData.nFileSizeHigh ) * 8;

      FileSize |= FindData.nFileSizeLow;

 

      return FileSize;

   }

 

   return 0; // File not found

}

 

< CreateFile을 이용하는 방법 >

__int64 GetFileSizeEx(const std::string& name)

{

    HANDLE hFile = CreateFile(name.c_str(), GENERIC_READ,

        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,

        FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile==INVALID_HANDLE_VALUE)

        return -1;

 

    LARGE_INTEGER size;

    if (!GetFileSizeEx(hFile, &size))

    {

        CloseHandle(hFile);

        return -1;

    }

 

    CloseHandle(hFile);

    return size.QuadPart;

}

추가로 폴더 생성 API에 대해서 알아보자.

< 폴더 생성 API >

#include <Dbghelp.h>

#pragma comment( lib, "Dbghelp.lib" )

 

BOOL bRes = MakeSureDirectoryPathExists("d:\\work\\test\\test\\test\\makedir\\");

폴더 마지막에 "\\"을 붙여야 마지막 폴더 까지 만들어 진다.

 

추가로 대용량 파일 읽기, 쓰기 예제이다.

< 대용량 파일 읽기 >

#define out

 

struct FileMemInfo

{

    unsigned char* pRead;

    long size;

};

 

bool ReadFile(std::string path, out FileMemInfo& info)

{

    FILE *pFile = NULL;

 

    errno_t err = fopen_s( &pFile, path.c_str(), "rb" );

    if(err != 0)

        return false;

 

    fseek( pFile, 0, SEEK_END );

    long size = ftell( pFile );   

    rewind(pFile);

 

    unsigned char *buff = new unsigned char [size];

 

    long nReadSize = 0, n = 0;

    while((n = fread(buff + nReadSize, 1, size - nReadSize, pFile)) > 0)

    {

        nReadSize += n;

    }

 

    fclose(pFile);

 

    info.pRead = buff;

    info.size = size;

    return true;

}

 

< 대용량 파일 쓰기 >

bool WriteFile(std::string path, const FileMemInfo& info)

{

    FILE *pFile = NULL;

 

    errno_t err = fopen_s( &pFile, path.c_str(), "wb" );

    if(err != 0)

        return false;

 

    unsigned char* buff = info.pRead;

    long count = info.size;

 

    long nWriteSize = 0, n = 0;

    while((n = fwrite(buff + nWriteSize, 1, count - nWriteSize, pFile)) > 0)

    {

        nWriteSize += n;

    }

 

    fclose(pFile);

 

    return true;

}