cvi中writefile函数怎么使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cvi中writefile函数怎么使用相关的知识,希望对你有一定的参考价值。

WriteFile函数通常是将数据写入到内部缓冲区,然后OS会定期将缓冲区中的数据写入到磁盘。如果想在调用WriteFile之后,数据就立即写入磁盘,有如下三种方法:
1. 调用FlushFileBuffers(hFile);
Flushes the buffers of a specified file and causes all buffered data to be written to a file.
BOOL FlushFileBuffers(
HANDLE hFile // open handle to file whose buffers are to be flushed
);
该函数会将指定文件的缓存数据写入磁盘。
2. 在用CreateFile创建文件的时候,第6个参数使用标志
FILE_FLAG_WRITE_THROUGH
Instructs the operating system to write through any intermediate cache and go directly to disk. The operating system can still cache write operations, but cannot lazily flush them.
3. 关闭掉句柄
CloseHandle(hFile);
参考技术A 从文件指针指向的位置开始将数据写入到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中如果文件要交互使用的话,当函数调用完毕时要记得调整文件指针参数说明HANDLE hFile, 需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_WRITE access 访问属性的文件LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULLvc返回值调用成功,返回非0调用不成功,返回为0用例:DWORDdev_write(LPCVOIDbuf,DWORDNumBytes)//写数据  DWORDwriteaddr=0; if(handle!=INVALID_HANDLE_VALUE)  WriteFile(handle,buf,NumBytes,&writeaddr,NULL);  returnwriteaddr;

WriteFile 将文件名写入文件

【中文标题】WriteFile 将文件名写入文件【英文标题】:WriteFile writing filename to file 【发布时间】:2014-10-19 08:39:47 【问题描述】:

我遇到了一个很奇怪的问题。

我正在连接 Xbox 360 上的 Winsock 功能,请发送。这个函数在我试图从中转储 Http 请求信息的应用程序中被大量调用。

首先我将展示代码并解释我的问题:

WritetoFile 函数。

BOOL WritetoFile(char* filename, char* buffer, DWORD len)


 // Setup expansion 
 doMountPath("Hdd:", "\\Device\\Harddisk0\\Partition1");    

 //print
 printf("Creating %s\n", filename);

 //create our file
 HANDLE fileHandle = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

 //does file exist?
 if(fileHandle!=INVALID_HANDLE_VALUE)
 
     //print
     printf("Writing to file... \n");

     //bytes written parameter
     DWORD wfbr;

     //write to our file
     if(WriteFile(fileHandle, (void*)&buffer, len, &wfbr, NULL))
     
         printf("File written! (Bytes Written:%u) \n", wfbr);
      else 
         printf("Error writing to file: (Error:%u)\n", GetLastError());
     

    //close our file handle
    CloseHandle(fileHandle);
   else 
      printf("Error creating file: (Error:%u)\n", GetLastError());
 

 return true;

Winsock 钩子

INT WINSOCK_SEND_HOOK(SOCKET s,const char FAR *buf,int len,int flags) 

memcpy(SocketData.SendData, buf, len);

if(len>40)

    WINSOCK_SEND_COUNT +=1;

    char Filename[40];
    sprintf(Filename, "Hdd:\\Dump\\Send\\Winsock_Send_%d.txt", WINSOCK_SEND_COUNT);
    WritetoFile(Filename, SocketData.SendData, len);


 else  printf("Winsock skipped\n"); 
memset(SocketData.SendData, 0, 0x1388);

return send(s, buf, len, flags);

这个问题很难解释。所以我第一次运行我的 .dll 来连接这个函数时,它运行良好,直到尝试创建“Winsock_Send_85.txt”。它打印这个:

  `Creating b0ZEK0EwSDBwSXR2RW5EdXd5ZXFnN1IrLzFQYno4RmN0ZnI2MnNnWWQwb2JXMGlYbEdQRkxGOXFkdHJabiszb1I2MG1vUFlkSjBJVW0xcFB4UzZxWEtqZEVYSjEvQmJtOHhmMUdVMDlZaHA2SUtWZTJjb0ZVU1RsUTlvYXJhc0NDOHJNUitlUDBaQmVSOTNUWVM1TU1hLzB0NlhGZmQ2dE1CVDRKVTRxdzliRUtlRmVvVGgvaVdoMUFBczBpNzhkcXNlVUYwaTlQT3B5ekdyeU9ZTzU0QWYyVXpUSXZiTDMzRWl4SXhzOUJOZDZxaWtDQUlNQmZkNHRYVTNaS2pKZngxRmd3dXE2QnRIYmkySlgxcE9vUjFyVlRpci9iZHdTZTZEOTJDSXFqNkNqM0lSaDY1N3VKUzhOQ3VxaFZpclhTUnZMZlJCN21mTS9aV2dCRUJNWHBVeUdZcGxqOVNGUÿÿexception code=0xc0000005 thread=0xf9000044 address=0x910d0a00 read=0x910d0a00 firstxbWatson: Xbox is restarting`

然后崩溃。重新启动控制台后,我再次运行它,它工作正常并且不会崩溃,但它现在正在将不正确的数据写入文件,这些文件都是相同的重复数据,即使缓冲区指向不同的数据。这是它写入文件的内容:

‘ÀÛ(       W              
 ÿÿÿÿÿÿÿÿ      ÿÿÿÿ‘Á  Hdd:\Dump\Send\Winsock_Send_87.txt   ‚i夀…Ü                  H>

然后我发现了一种阻止这种情况发生的方法,即完全断开控制台的所有电源,但随后又回到第一个问题。

请忽略您可能认为不必要的 memcpy 用途。

【问题讨论】:

【参考方案1】:

问题很快就解决了(令人尴尬),我不敢相信我为此苦苦挣扎了 1 个小时,愚蠢的错误。

我没有检查缓冲区的大小,因此我没有分配足够的内存。

【讨论】:

以上是关于cvi中writefile函数怎么使用的主要内容,如果未能解决你的问题,请参考以下文章

golang ioutil.WriteFile函数perm参数的用法

LabWindows/CVI第一章:基本规则

Go的文件读写几种方法

Go的文件读写几种方法

python writefile 怎么退出

使用 EtherType 0x88A4 (EtherCat) 时,WriteFile 函数 (NDIS) 中出现错误 87