zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    生成token和获取token
    python异常处理
    获取文件路径
    批量导出和批量安装第三方模块
    python操作从数据库中获取数据的接口
    centos中开机时如何自启动samba服务器
    MSSQL 创建自定义异常
    MSSQL 生成拼音码
    MSSQL FOR MXL PATH 运用(转载)
    MSSQL旋转和反旋转的例子
  • 原文地址:https://www.cnblogs.com/rogerroddick/p/2944006.html
Copyright © 2011-2022 走看看