头文件
ubase-fs.h:
#pragma once
//Windows Api
#include <windows.h>
//C++ Standard Library
#include <string>
typedef std::basic_string<TCHAR> tstring;
namespace UBASE
{
DWORD FsGetFileSize(const tstring& FilePath);
DWORD64 FsGetFileSize64(const tstring& FilePath);
bool FsReadFileData(const tstring& FilePath, std::string& Data);
bool FsReadFileData(const tstring& FilePath, std::string& Data, DWORD ReadSize, DWORD64 FileOffset = 0);
bool FsWriteFileData(const tstring& FilePath, std::string Data, DWORD64 FileOffset = 0);
bool FsAppendFileData(const tstring& FilePath, const std::string& Data);
}
源文件
ubase-fs.cpp:
#include "ubase-fs.h"
namespace UBASE
{
#ifndef MAKELONGLONG
#define MAKELONGLONG(a, b) ((LONGLONG(DWORD(a) & 0xFFFFFFFF) << 32 ) | LONGLONG(DWORD(b) & 0xFFFFFFFF))
#endif
#ifndef LONGLONGHIGH
#define LONGLONGHIGH(a) DWORD((LONGLONG(a) & 0xFFFFFFFF00000000UI64) >> 32)
#endif
#ifndef LONGLONGLOW
#define LONGLONGLOW(a) DWORD(LONGLONG(a) & 0xFFFFFFFFUI64)
#endif
DWORD FsGetFileSize(const tstring& FilePath)
{
HANDLE fd = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fd == INVALID_HANDLE_VALUE) {
return 0;
}
DWORD lo_size = GetFileSize(fd, NULL);
if (lo_size == INVALID_FILE_SIZE) {
CloseHandle(fd);
return 0;
}
CloseHandle(fd);
return lo_size;
}
DWORD64 FsGetFileSize64(const tstring& FilePath)
{
HANDLE fd = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fd == INVALID_HANDLE_VALUE) {
return 0;
}
DWORD hi_size = 0;
DWORD lo_size = GetFileSize(fd, &hi_size);
if (lo_size == INVALID_FILE_SIZE) {
CloseHandle(fd);
return 0;
}
CloseHandle(fd);
return MAKELONGLONG(hi_size, lo_size);
}
bool FsReadFileData(const tstring& FilePath, std::string& Data)
{
bool Result = false;
DWORD FileSize = 0;
HANDLE File = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (File == INVALID_HANDLE_VALUE)
{
return false;
}
FileSize = GetFileSize(File, NULL);
if (FileSize != INVALID_FILE_SIZE)
{
if (FileSize == 0) {
Result = true;
}
else {
char* Buffer = new(std::nothrow) char[FileSize];
if (Buffer != NULL)
{
DWORD ReadLen;
if (ReadFile(File, Buffer, FileSize, &ReadLen, NULL))
{
if (ReadLen == FileSize) {
try {
Data.assign(Buffer, FileSize);
Result = true;
}
catch (...) {
Data.clear();
}
}
}
delete[] Buffer;
}
}
}
CloseHandle(File);
return Result;
}
bool FsReadFileData(const tstring& FilePath, std::string& Data, DWORD ReadSize, DWORD64 FileOffset)
{
bool Result = false;
HANDLE File = CreateFile(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (File == INVALID_HANDLE_VALUE)
{
return false;
}
LONG low = LONGLONGHIGH(FileOffset);
SetFilePointer(File, LONGLONGLOW(FileOffset), &low, FILE_BEGIN);
char* Buffer = new(std::nothrow) char[ReadSize];
if (Buffer != NULL)
{
DWORD ReadLen;
if (ReadFile(File, Buffer, ReadSize, &ReadLen, NULL))
{
if (ReadLen == ReadSize) {
try {
Data.assign(Buffer, ReadSize);
Result = true;
}
catch (...) {
Data.clear();
}
}
}
delete[] Buffer;
}
CloseHandle(File);
return Result;
}
bool FsWriteFileData(const tstring& FilePath, std::string Data, DWORD64 FileOffset)
{
bool Result = false;
HANDLE File = CreateFile(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (File != INVALID_HANDLE_VALUE)
{
DWORD WriteLen = 0;
LONG low = LONGLONGHIGH(FileOffset);
SetFilePointer(File, LONGLONGLOW(FileOffset), &low, FILE_BEGIN);
if (WriteFile(File, Data.data(), (DWORD)Data.size(), &WriteLen, NULL)) {
if (Data.size() == WriteLen) {
Result = true;
}
}
CloseHandle(File);
}
return Result;
}
bool FsAppendFileData(const tstring& FilePath, const std::string& Data)
{
bool Result = false;
HANDLE File = CreateFile(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (File != INVALID_HANDLE_VALUE)
{
DWORD WriteLen;
SetFilePointer(File, 0, NULL, FILE_END);
if (WriteFile(File, Data.c_str(), (DWORD)Data.size(), &WriteLen, NULL)) {
if (Data.size() == WriteLen) {
Result = true;
}
}
CloseHandle(File);
}
return Result;
}
}
测试代码:
#include "ubase-fs.h"
int main()
{
tstring FilePath = _T("test.txt");
//写文件
UBASE::FsWriteFileData(FilePath, "123");
//文件大小
DWORD Size = UBASE::FsGetFileSize(FilePath);
printf("%d\n", Size);
//读文件
std::string FileData;
UBASE::FsReadFileData(FilePath, FileData);
printf("FileData:%s\n", FileData.c_str());
//追加文件
UBASE::FsAppendFileData(FilePath, "456");
//写文件 二进制
std::string Data;
Data.append(10, 0x1);
UBASE::FsWriteFileData(FilePath, Data);
system("pause");
return 0;
}