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. 总结

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值