• C++ File on Windows


    Create file

    HANDLE hFile = ::CreateFile(lpcszFileName, GENERIC_READ | GENERIC_WRITE,  
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     
    Create file with specified size
    BOOL bResult = FALSE; 
    HANDLE hFile = ::CreateFile(lpcszFileName, GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (INVALID_HANDLE_VALUE == hFile)
    {
    return (BOOL)::GetLastError();
    }

    HANDLE hFileMap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, dwHigh, dwLow, NULL);
    if (NULL == hFileMap)
    {
    return (BOOL)::GetLastError();
    }

    ::CloseHandle(hFileMap);
    ::CloseHandle(hFile);

    WriteFile is more efficient than fwrite, because fwrite calls down to WriteFile internally

    #include <Windows.h>
    #include <stdio.h>
    #include <iostream>

    int main() {
    FILE* cfile = fopen("file1.txt", "w");
    HANDLE wfile = CreateFile("file2.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
    /*FILE_ATTRIBUTE_NORMAL*/FILE_FLAG_WRITE_THROUGH, NULL);
    DWORD written = 0;

    DWORD start_time, end_time;
    char * text = "test message ha ha ha ha";
    int size = strlen(text);
    int times = 999;

    start_time = timeGetTime();
    for(int i = 0; i < times; ++i) {
    fwrite(text, 1, size, cfile);
    fflush(cfile);
    }
    end_time = timeGetTime();
    std::cout << end_time - start_time << '\n';

    start_time = timeGetTime();
    for(int i = 0; i < times; ++i) {
    WriteFile(wfile, text, size, &written, NULL);
    //FlushFileBuffers(wfile);
    }
    end_time = timeGetTime();
    std::cout << end_time - start_time << std::endl;

    system("pause");
    return 0;
    }
    Do not call FlushFileBuffers explicitly, data in system cache will be flushed to disk when needed.
    Get a buffer for WriteFile, just as fwrite does, because API call cost more time than simply memcpy, call WriteFile when buffer is filled up.
    For windows, fwrite() will write the data to a buffer until that buffer fills, which will cause it to send the data in the buffer to WriteFile() call. When you call fflush() all that happens is that the data currently in the buffer is passed to a call to WriteFile() – fflush() doesn't call FlushFileBuffer().
     
    Rename a file
    if (MoveFile(_T("c:\\temp\\down.txt.tg"), _T("c:\\temp\\down.txt")) == 0)
    {
    cout<<::GetLastError()<<endl;
    }


  • 相关阅读:
    [读书笔记]-技术学习-微服务架构与实践
    [文章转载]-Java后端,应该日常翻看的中文技术网站 -江南白衣
    [文章转载]-我的Java后端书架-江南白衣
    正则表达式有多强大一看便知!
    微信小程序支付功能完整流程
    判断字符串是否合法(1)
    ES6新增常用方法
    JS求一个字符串在另一个字符串中出现的次数
    根据对象的某个属性排序
    数组去除重复值的四种超简便方法
  • 原文地址:https://www.cnblogs.com/rogerroddick/p/2944006.html
Copyright © 2020-2023  润新知