OE worldwind编码 遍历文件

#include <io.h>        //for _finddata_t,_findfirst,_findnext,_findclose
#include <direct.h> //for mkdir
#include <iostream>
#include <string>
using namespace std;

// 查询C:/windows文件夹下.exe文件的个数
void traverse(string fileName = "C:/windows/*.exe", int exeNum = 0)
{
    _finddata_t fileInfo;
    long handle = _findfirst(fileName.c_str(), &fileInfo);

    if (handle == -1L)
    {
        cerr << "failed to transfer files" << endl;
    }

    do 
    {
        exeNum ++;
        cout << fileInfo.name <<endl;
    } while (_findnext(handle, &fileInfo) == 0);
    cout << " .exe files' number:  " << exeNum << endl;

    _findclose(handle);
}
// 将字符串s中的所有的'/'替换成'\'
string replaceChar(string &s){

    // 这里值得一提的是字符串里面的'\'得写成"\\"

    while(s.find("/") != string::npos){
        s.insert(s.find("/"),1,'/');
        s.replace(s.find("/"),2,"\\");
    }
    return s;
}
// 遍历一个路径下所有的文件(包括子文件夹里面的文件)
int fileCnt=0;
void dfsFolder(string srcPath /*= "C:/a"*/, string dstPath /*= "d:/root"*/)
{
    _finddata_t FileInfo;
    string strfind = srcPath + "/*";
    long Handle = _findfirst(strfind.c_str(), &FileInfo);

    if (Handle == -1L)
    {
        cerr << "can not match the folder path" << endl;
        return ;
    }
    do{
        //判断是否有子目录
        if (FileInfo.attrib == _A_SUBDIR)    
        {
            // 由于系统在进入一个子目录时,匹配到的头两个文件(夹)
            // 是"."(当前目录),".."(上一层目录)。需要忽略掉这两种情况
            if( (strcmp(FileInfo.name,".") != 0 ) &&(strcmp(FileInfo.name,"..") != 0))   
            {
                string newPath = srcPath + "/" + FileInfo.name;
                dfsFolder(newPath,dstPath);
            }
        }
        else  
        {
            // 文件名字(包括后缀名)
            string nameExt(FileInfo.name);
            // 文件格式
            string ext = nameExt.substr(nameExt.rfind('.'));
            // 如果不是影像或者高程数据,则不予处理
            if (ext != ".tif" && ext != ".jpg" && ext != ".png" && ext != ".gif")
                continue;
            //
            string rowStr = nameExt.substr(0,nameExt.length()-ext.length());
            //
            string columStr = srcPath.substr(srcPath.rfind('/')+1);
            // 中间变量,为了求“层数”
            string tmp = srcPath;
            tmp.erase(srcPath.rfind('/'));
            //
            string layerStr = tmp.substr(tmp.rfind('/')+1);

            // 将层、行、列转换成数值
            int layer = atoi(layerStr.c_str());
            int colum = atoi(columStr.c_str());
            int row = atoi(rowStr.c_str());

            float degreePerGrid = 180.0f/pow(2.0,layer);
            float longitude = colum * degreePerGrid-180;
            float latitude = row * degreePerGrid - 90;

            //string tileRootPath = tmp.erase(tmp.rfind('/'));

            // 创建存储影像和高程数据的文件夹
            if(-1 == _access((dstPath+"/image").c_str(),0))
                system(("mkdir "+replaceChar(dstPath+"/image")).c_str());
            if(-1 == _access((dstPath+"/elevation").c_str(),0))
                system(("mkdir "+replaceChar(dstPath+"/elevation")).c_str());

            // 行列不足4位(world wind瓦片文件的命名规则),左边用'0'补齐
            while(rowStr.size()<4)
                rowStr.insert(0,1,'0');
            while(columStr.size()<4)
                columStr.insert(0,1,'0');
            // 处理影像图片
            if( ".jpg" == ext )
            {
                // 创建(层-行)文件夹,World Wind瓦片按照行优先存储
                if(-1 == _access((dstPath+"/image/"+layerStr+"/"+rowStr).c_str(),0))
                    system(("mkdir "+replaceChar(dstPath+"/image/"+layerStr+"/"+rowStr)).c_str());
                
                string newName = rowStr+"_"+columStr;
                string source = srcPath+"/"+nameExt;
                string destination = dstPath+"/image/"+layerStr+"/"+rowStr+"/"+newName+ext;

                // 下面将source和destination里面的'/'替换成'\'
                // 因为要用到system调用,而system调用中的'/'的含义是选项设置,⊙﹏⊙b汗
                replaceChar(source);
                replaceChar(destination);

                // 一时找不到好的复制文件的函数,只知道dos命令行的system调用
                system(("copy "+source+" "+destination).c_str());
                // rename函数可以用来移动文件,但是目标路径必须存在,否则此函数不起作用
                //rename(source.c_str(),destination.c_str());
            }
            else if(".tif" == ext)
            {
                if(-1 == _access((dstPath+"/elevation/"+layerStr+"/"+rowStr).c_str(),0))
                    system(("mkdir "+replaceChar(dstPath+"/elevation/"+layerStr+"/"+rowStr)).c_str());
                fileCnt++;
                string newName = rowStr+"_"+columStr;
                string source = srcPath+"/"+nameExt;
                string destination = dstPath+"/elevation/"+layerStr+"/"+rowStr+"/"+newName+ext;

                replaceChar(source);
                replaceChar(destination);
                
                //cout<<source<<endl<<destination<<endl;
                system(("copy "+source+" "+destination).c_str());
                
                // rename函数可以用来移动文件,但是目标路径必须存在,否则此函数不起作用
                //rename((fullPath+ext).c_str(),"d:/a/a.jpeg"/*newName.c_str()*/);
            }
        }
    }while (_findnext(Handle, &FileInfo) == 0);

    _findclose(Handle);

}
void main(int argc, char **argv)
{
    //traverse();

    // 新建一个文件夹
    //system("mkdir c:\\a\\b");

    dfsFolder("d:/china","d:/root1");

    // 删除一个目录以及里面的子文件夹及其文件
    //system("rd /s /q d:\\a");
    system("pause");
}

 

posted @ 2013-04-22 10:57  酷熊  阅读(221)  评论(0编辑  收藏  举报