linux ubuntu下使用io.h下的获取文件路径报错解决方法

1、报错描述

(1)代码

#include <io.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>


using namespace std;
void getAllFiles(string path, vector<string>&files, string fileType)
{
    //文件句柄
    long hFile = 0;
    struct _finddata_t fileInfo;
    string p;

    if ((hFile = _findfirst(p.assign(path).append("\\*" + fileType).c_str(), &fileInfo)) != -1){
        do{
            files.push_back(p.assign(path).append("\\").append(fileInfo.name));
        } while (_findnext(hFile, &fileInfo) == 0);

        _findclose(hFile);//关闭句柄
    }
}

int main(int argc)
{
    cout<<"308"<<endl;
    vector<string> temp;
    getAllFiles("\\mnt\\data2\\xuqiong\\image\\meiqi\\trunk\\testbd\\path", temp, ".jpg");

    for (int i = 0; i < temp.size(); i++){
        cout << temp[i] << endl;
    }
    
    return 0;
}

(2)报错内容:

/mnt/data2/xuqiong/image/meiqi/trunk/testbd/test_image.cpp: In function ‘void getAllFiles(std::__cxx11::string, std::vector<std::__cxx11::basic_string<char> >&, std::__cxx11::string)’:

/mnt/data2/xuqiong/image/meiqi/trunk/testbd/test_image.cpp:82:24: error: aggregate ‘getAllFiles(std::__cxx11::string, std::vector<std::__cxx11::basic_string<char> >&, std::__cxx11::string)::_finddata_t fileInfo’ has incomplete type and cannot be defined

     struct _finddata_t fileInfo;

/mnt/data2/xuqiong/image/meiqi/trunk/testbd/test_image.cpp:85:87: error: _findfirst’ was not declared in this scope

     if ((hFile = _findfirst(p.assign(path).append("\\*" + fileType).c_str(), &fileInfo)) != -1){

/mnt/data2/xuqiong/image/meiqi/trunk/testbd/test_image.cpp:88:44: error: _findnext’ was not declared in this scope

         } while (_findnext(hFile, &fileInfo) == 0);

/mnt/data2/xuqiong/image/meiqi/trunk/testbd/test_image.cpp:90:25: error: _findclose’ was not declared in this scope

         _findclose(hFile);//关闭句柄

(3)分析

io.h 头文件可能不兼容跨平台操作。在windows下这个头文件运行稳定,但是在linux下这个头文件不能正常运行。

参考:https://www.cnblogs.com/gdut-gordon/p/9678175.html

 

2、解决方法

//头文件
#include <iostream>
#include <sys/types.h>
#include <dirent.h>
#include <vector>
#include <string.h>
 
using namespace std;
 
 
void GetFileNames(string path,vector<string>& filenames)
{
    DIR *pDir;
    struct dirent* ptr;
    if(!(pDir = opendir(path.c_str())))
        return;
    while((ptr = readdir(pDir))!=0) {
        if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0)
            filenames.push_back(path + "/" + ptr->d_name);
    }
    closedir(pDir);
}
 
int main() {
    vector<string> file_name;
    string path = "/home/image";
 
    GetFileNames(path, file_name);
 
    for(int i = 0; i <file_name.size(); i++)
    {
        cout<<file_name[i]<<endl;
    }
 
    return 0;
}

参考:https://blog.csdn.net/lsq2902101015/article/details/51373911

 

<think>好的,用户现在在Linux上遇到问题,运行`sudo systemctl restart docker`时提示“Unit docker.service not found”。我需要帮他们解决这个问题。首先,我应该回想一下可能导致这个错误的原因。 首先想到的是Docker服务是否真的安装正确。用户可能没有安装Docker,或者安装过程中出现了问题。例如,他们可能通过不同的方式安装,比如snap包,或者手动安装,而systemctl找不到服务文件。这时候需要检查Docker的安装状态。 接下来,用户可能使用的是较旧的Linux发行版,比如使用Upstart而不是systemd的系统。例如,Ubuntu 14.04或更早版本不使用systemd,所以systemctl命令无效,这时候需要用service命令来管理服务。 另外,Docker的服务名称可能有变化。比如,在某些情况下,服务名称可能不是docker.service,而是docker.io.service或者其他名称,或者用户安装了Docker的其他版本,比如Docker CE和EE可能会有不同的服务名称。 还可能存在服务文件被删除或损坏的情况,比如用户手动删除了服务文件,或者在安装过程中出现错误,导致服务未正确注册到systemd中。 现在需要一步步引导用户检查这些问题。首先确认Docker是否安装,可以通过运行`docker --version`来检查。如果未安装,需要指导他们正确安装Docker。如果已安装,但服务不存在,可能需要检查服务名称是否正确,或者是否使用其他初始化系统。 如果用户使用的是非systemd系统,需要提醒他们使用service命令,例如`sudo service docker restart`。同时,如果服务文件确实缺失,可能需要重新安装Docker或手动创建服务文件。 还需要考虑用户是否在安装Docker后没有启用服务,比如在安装后没有运行`systemctl enable docker`,导致服务未被正确注册。不过这种情况下,服务文件应该还是存在的,只是未启用。 总结下来,解决步骤可能包括:检查Docker安装状态、确认服务名称、检查是否使用systemd、重新安装Docker、检查服务文件是否存在等。需要逐步引导用户进行这些检查,并提供相应的命令和解决方案。</think>### 问题分析 在Linux中执行 `sudo systemctl restart docker` 时出现 `Unit docker.service not found` 错误,表明 **systemd未找到Docker服务**。常见原因包括: 1. **Docker未正确安装**(服务文件缺失)。 2. **系统未使用systemd管理服务**(例如旧版Ubuntu使用Upstart)。 3. **Docker服务名称不匹配**(如 `docker.io.service`)。 4. **Docker安装后未启用服务**(服务未注册到systemd)。 --- ### 分步解决方案 #### 步骤1:确认Docker是否已安装 1. **检查Docker二进制文件是否存在**: ```bash which docker # 输出应为 `/usr/bin/docker` 或类似路径 docker --version # 确认版本信息 ``` - 若未安装,跳转至 **步骤3**。 --- #### 步骤2:检查Docker服务名称 1. **查看systemd服务文件**: ```bash # 列出所有Docker相关服务 systemctl list-unit-files | grep -i docker ``` - 正常应输出 `docker.service` 或 `docker.io.service`。 - 若未找到,尝试直接启动Docker守护进程: ```bash sudo dockerd # 手动启动Docker引擎 ``` - 若此命令成功但服务仍缺失,需重新安装Docker。 --- #### 步骤3:重新安装Docker 1. **卸载旧版本**: ```bash sudo apt-get purge docker-ce docker-ce-cli containerd.io # Debian/Ubuntu sudo yum remove docker-ce docker-ce-cli containerd.io # CentOS/RHEL ``` 2. **安装官方Docker引擎**: ```bash # Debian/Ubuntu curl -fsSL https://get.docker.com | sudo sh # CentOS/RHEL sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io ``` 3. **验证服务状态**: ```bash sudo systemctl status docker # 应显示 `active (running)` ``` --- #### 步骤4:处理非systemd系统(如Upstart) 1. **检查初始化系统**: ```bash ps -p 1 -o comm= # 输出 `systemd` 表示使用systemd,否则可能是Upstart/SysVinit ``` 2. **使用SysVinit命令**: ```bash # 旧版Ubuntu/CentOS 6 sudo service docker restart ``` --- ### 常见错误场景 1. **报错 `docker.service not found` 且Docker已安装** **原因**:服务文件未正确生成。 **修复**: - 手动创建服务文件(路径:`/etc/systemd/system/docker.service`): ```ini [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service Wants=network-online.target [Service] ExecStart=/usr/bin/dockerd -H fd:// ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity TimeoutStartSec=0 [Install] WantedBy=multi-user.target ``` - 重新加载systemd配置: ```bash sudo systemctl daemon-reload sudo systemctl enable docker ``` --- ### 操作原理说明 - `systemctl` 是systemd管理服务的工具,依赖 `/etc/systemd/system/` 或 `/lib/systemd/system/` 中的 `.service` 文件。 - 若Docker安装过程中未生成服务文件(如手动安装或脚本错误),会导致服务不可控。 --- ### 总结建议 - **优先使用官方安装脚本**(`curl -fsSL https://get.docker.com | sudo sh`)避免兼容性问题。 - 对于Ubuntu 14.04等旧系统,建议升级到支持systemd的版本(如Ubuntu 16.04+)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值