C/C++ 在Linux系统中,解决无法往U盘创建文件和写入数据的问题

Posted cpp_learners

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 在Linux系统中,解决无法往U盘创建文件和写入数据的问题相关的知识,希望对你有一定的参考价值。

最近在Linux下做项目,遇到一个问题,困扰了我许久,就是无法用代码往U盘中创建文件或写入文件数据,现在解决了,记录下来,给遇到类似问题的朋友提供一个解决办法!


1. 问题

先来看一段简单的代码,用C语言的FILE往U盘中创建文件和写入数据:

printf("是否将登录信息加密保存到U盘中;\\n点击“是”,下次插入此U盘将无需重复身份认证!");
/* 获取U盘路径 */
std::string filePath = "/" + "user.txt";	// 假设这里获得“U盘”路径
FILE *file = fopen(filePath.c_str(), "w");
if (file) 
    std::string str = "往文件中写入数据!";
    n = fwrite(str.c_str(), sizeof(char), str.length(), file);
    if (0 == n) 
        print("登录信息加密保存到U盘失败!");
    

    fclose(file);

代码很简单,但在Linux下运行,却没法在U盘中创建user.txt文件和往这个文件中写入数据"往文件中写入数据!"。


2. 原因

原因很简单:数据同步!

Linux 系统中欲写入硬盘的资料有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了.

所以上面的程序代码,只是将文件和文件数据存入buffer中而已,还没有真正的写入U盘!


3. 解决 - sync

  1. Linux sync命令用于数据同步,sync命令是在关闭Linux系统时使用的。

    Linux中可以在终端直接调用:例如我是在国产Linux系统统信UOS测试:

    sync 指令会将存于 buffer 中的资料强制写入硬盘中。

  2. sync是C语言的一个库函数
    调用sync可以将系统缓冲区(内存中)的数据写入到文件系统(磁盘)中。

    int sync(void);
    头文件:include < unistd.h >

    当同步成功返回0,否则返回-1。

    功能为将系统缓冲区的内容写回磁盘,以确保数据同步。

    修改上面代码,加上一个函数sync()即可!

    printf("是否将登录信息加密保存到U盘中;\\n点击“是”,下次插入此U盘将无需重复身份认证!");
    /* 获取U盘路径 */
    std::string filePath = "/" + "user.txt";	// 假设这里获得路径
    FILE *file = fopen(filePath.c_str(), "w");
    if (file) 
        std::string str = "往文件中写入数据!";
        n = fwrite(str.c_str(), sizeof(char), str.length(), file);
        if (0 == n) 
            print("登录信息加密保存到U盘失败!");
        
    
        fclose(file);
    
    
    /* 数据同步 */
    #if defined (_WIN64) || defined (WIN32) || defined (_WIN32)
    
    #else
        sync(); // hui chang zhong yao!
    #endif
    

在Linux操作系统中,除非设置了自动同步,否则为了减少磁盘的写入量,延长磁盘寿命,写入文件时并不是即时写入到磁盘中,而是先写入内存,这段内存区域被称为系统缓冲区。在系统缓冲区数据累计到一定数量后(具体数量因系统实际设置而定),会有系统进程一次性写入所有缓冲数据。这样,如果意外断电,那么系统缓冲区内数据就会因此丢失。于是在写入一些重要数据时,都会在写入结束后进行一次sync()的调用,保证数据已经被写入磁盘,降低数据丢失或损坏的可能性。

这样就完美解决了!

注意
这是C语言在Linux独有的一个函数,在Window是没有的,所以sync()不可以在Window系统中去使用!
所在在代码中我才会加上#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)的判断。


4. 总结

这个是我在项目中遇到的问题,记录下来,也算是代码积累吧,以后就再也不会再踩一次这个坑了!
也希望给遇到此类问题的朋友提供一个解决办法的参考!

以上是关于C/C++ 在Linux系统中,解决无法往U盘创建文件和写入数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

u盘linux不能挂载

在linux中怎样将文件拷贝到u盘中

linux怎么挂载u盘

U盘安装LINUX系统,拔除U盘后无法引导系统

系统安装安装程序无法创建新的系统分区

U盘安装LINUX系统,拔除U盘后无法引导系统