有很多的时候 会出现没有用的优盘路径 如果代码中写的是绝对路径 就有可能读不到优盘的内容 ,以下代码就是可以解决这样的问题  我已经封装成一个类

 

upanpath.h

#ifndef UPANPATH_H
#define UPANPATH_H

#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <vector>
#include <iostream>
#include <unistd.h>

using namespace std;


class UPanPath
{
public:
    UPanPath(string file_name,string UPan_name,string target_file_name);
    ~UPanPath();
    string fileName;
    string UPanName;
    string targetFileName;
    vector<string> getFoldernames( const string dir_name, const string filter1);
    bool dirIsExit( const string dir_name );
    string getFilePath();
};
#define   NOROBOT     "no find ROBOT file"
#define   NOEFFECTIVE "no find effective file"
#endif // UPANPATH_H

upanpath.cpp

#include "upanpath.h"

UPanPath::UPanPath(string file_name,string UPan_name,string target_file_name)
{
    this->fileName = file_name ;
    this->UPanName = UPan_name;
    this->targetFileName = target_file_name;
}
/* Get all the files in the folder dir_name , do not show the directories ! */
bool UPanPath::dirIsExit(const string dir_name)
{
        // check the parameter !
        if( "" == dir_name )
        {
            cout<<" dir_name is null ! "<<endl;
            return false;
        }
        // check if dir_name is a valid dir
        struct stat s;
        lstat( dir_name.c_str() , &s );
        if( ! S_ISDIR( s.st_mode ) )
        {
            cout<<dir_name << " is not a valid directory !"<<endl;
            return false;
        }
        return true;

}
/* Get all the files in the folder dir_name , do not show the directories !
*  此函数可以得到指定目录下的所有文件和文件夹名,可以对其进行筛选,只要文件,然后再根据两个过滤器依次进行筛选,得到指定的文件。
*/
vector<string> UPanPath::getFoldernames( const string dir_name, const string filter)
{
    vector<string> dirs;
    // check the parameter !
    if( "" == dir_name )
    {
        cout<<" dir_name is null ! "<<endl;
        return dirs;
    }

    // check if dir_name is a valid dir
    struct stat s;
    lstat( dir_name.c_str() , &s );
    if( ! S_ISDIR( s.st_mode ) )
    {
        cout<<dir_name << " is not a valid directory !"<<endl;
        return dirs;
    }

    struct dirent * filename;    // return value for readdir()
    DIR * dir;                   // return value for opendir()
    dir = opendir( dir_name.c_str() );
    if( NULL == dir )
    {
        cout<<"Can not open directory "<<dir_name<<endl;
        return dirs;
    }
    cout<<"Open the directory successfully!"<<endl;

    string path;
    if( dir_name.substr(dir_name.length()-1, 1) != "/" )
        path = dir_name + "/";
    else
        path = dir_name;

    struct stat s_buf;
    string dir_tmp;
    /* read all the files in the dir ~ */
    while( ( filename = readdir(dir) ) != NULL )
    {
        dir_tmp = filename ->d_name;
        // get rid of "." and ".."
        if( "."  == dir_tmp || ".." == dir_tmp )
            continue;

        /*获取文件信息,把信息放到s_buf中*/
        stat( (path + dir_tmp).c_str(), &s_buf );
        /*判断是否目录*/
        if( !S_ISDIR(s_buf.st_mode) )
            continue;

        if("" != filter)
        {
            if((int)dir_tmp.find(filter) >= 0)
                dirs.push_back(dir_tmp);
        }
        else
            dirs.push_back(dir_tmp);

    }
    return dirs;
}
string UPanPath::getFilePath()
{
    vector<string> dir_f = UPanPath::getFoldernames(UPanPath::fileName,UPanPath::UPanName);
    cout << "文件的个数:"<<dir_f.size() << endl;
    string faces_dir = "";
    vector<string> upan_name ;
    for(int i=0; i< dir_f.size(); i++)
    {
        cout << "dir_f[" << i << "]: " << dir_f[i] << endl;
        string dir_tmp = UPanPath::fileName; //+"/"+ dir_f[i];
        dir_tmp += "/";
        dir_tmp += dir_f[i];
        dir_tmp += "/";
        dir_tmp += UPanPath::targetFileName;
        cout << dir_tmp <<endl;
        if( 0 != system( ("cd " + dir_tmp).c_str() ) )
        {
            if( 0 == system( ("sudo rm -rf " + dir_tmp).c_str() ) )
                cout << "Delet invalid Upan folder [ " << dir_tmp << " ] successfully..." << endl;
            else
                cout << "Failed to delete invalid Upan folder [ " << dir_tmp << " ] ..." << endl;
        }
        else
            upan_name.push_back(dir_f[i]);
    }

    int len = upan_name.size();
    if ( 0 == len )
    {
        cout << "Don't find the Upan [ ROBOT ], please insert the Upan first ..." << endl;
        return NOROBOT;
    }

    else
    {
        for (int i=0; i<len; i++)
        {
            string dir_tmp = UPanPath::fileName;
            dir_tmp += "/";
            dir_tmp += upan_name[i];
            dir_tmp += "/";
            dir_tmp += UPanPath::targetFileName;
            cout << dir_tmp <<endl;
            if(UPanPath::dirIsExit(dir_tmp))
            {
                faces_dir = dir_tmp;
                break;
            }
        }
        if("" == faces_dir)
        {
            cout << "Don't find the folder [ faces ] in the Upan ..." << endl;
            return NOEFFECTIVE;
        }

        else
        {
            cout << "Find the Upan faces folder [ " << faces_dir << " ] ..." << endl;
            return faces_dir;
        }
    }
}
UPanPath::~UPanPath()
{
    cout << "析构函数"<< endl;
}

main.cpp

#include <QCoreApplication>

#include "upanpath.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    UPanPath  *P = new UPanPath("/media/alvin","ROBOT","faces");
    string  FilePath =  P->getFilePath();
    cout << "effective file path :" << FilePath << endl;

    return a.exec();
}

可以根据函数的返回值的 不同确定什么原因导致读取失败。