您的位置:澳门402永利com > 编程应用 > QT张开文件路线中饱含普通话和空格难点,写一个

QT张开文件路线中饱含普通话和空格难点,写一个

发布时间:2019-09-23 20:45编辑:编程应用浏览(146)

    运用qt-mingw版做的软件,发给客户今后说专门的学业不正规,配置文件不可能开采,恐怕加载数据文件不正规。远程查看今后,发掘客商平时将顺序放置在普通话带空格的渠道下,导致文件展开不不奇怪。所以近些日子想在前后相继上减轻一下,让顾客少出标题。

              本来感到这么一个轻易的复制文件夹的台本十来分钟就消除了,结果搞了一早上才消除。

    首先在英特网查了QT张开文件路线中含有普通话和空格难题,抄了之类代码:(

              其实思路特别简单,就是设定$fromDir和$toDir,将$fromDir目录的文书全体复制到$toDir,其实搞这些本子的指标正是把本人Computer下面的公文自动复制到笔者的移动硬盘上面来,起三个备份的效果,二个个手动的正片太困苦,个人相比较懒,所以就筹划搞一个脚本来做。

     1     QString fileName=QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files(*.png *.jpg *jpeg *.bmp *.avi *.mp4)")); 2   3     QTextCodec *code = QTextCodec::codecForName("GB2312");//解决中文路径问题 4     std::string name = code->fromUnicode.data(); 5   6     if(fileName.isEmpty 7     { 8             return; 9     }10  11     inputVideo.open;//我准备打开的是本地视频文件
    

              由于文件夹中只怕有子文件夹,所以利用广度优先,即扫描文件的时候发掘这一个文件是二个文书夹,就把它归入到行列的末段,然后继续扫描,等把那些文件夹的文书扫描完结,就此伏彼起从队列中抽出三个成分,一向到行列为空。

    特别简单于是就加在本身代码里了:

              队列这一块都没出什么难题,而主题素材根本出在了华语目录上面,英特网查了须臾间,windows文件名的编码要改成GBK,而有一点都不小希望文件名编码是UTF-8,这样就导致文件名乱码。

     1 if(ui->bt_replay->text()=="回放") 2 { 3     auto name=QFileDialog::getOpenFileName(0,"","","pcap文件"); 4     QTextCodec *code = QTextCodec::codecForName("gb2312");//解决中文路径问题 5     name = code->fromUnicode.data(); 6     cout<<"convert gb2312:"<<name.toStdString()<<endl; 7     if(name!="") 8     { 9 10         lctrl.replay_dat(name.toStdString;11         ui->bt_replay->setText("退出回放");12         lctrl.replay_stat=1;13         ui->lb_replay_stat->setText("加载数据");14     }15 }
    

               最开头选拔iconv实行转码,不过开掘使用那些转码之后又确定的主题材料,如iframe代码.txt那么些字符串转码后产生了iframe,完全错了。。。

    结果拾贰分。以为是编码难题,换了编码,加了编码成功的论断,无论怎么着也充足,可是在网络搜到的代码都非常简单。

               后边查到还是能运用mb_convert_encoding来转码,所以修改了刹那间:

    最终发掘,QString的存款和储蓄是按Unicode存的,输入的时候会把输入数据转变到Unicode,转码形式私下认可是Latin-1,导致转码今后的文本名又被转回来了,何况转的还不对

    function changeEncoding($str) {
        if(mb_check_encoding($str,'UTF-8')) {
            //只有UTF-8编码的时候才进行转码
            return mb_convert_encoding($str,"GBK","UTF-8");
        }
        return $str;
        //return iconv('UTF-8','GBK',$str);
    }
    

    于是利用std::string化解这一个难点:

               后边乱码消除了,尽管是那样轻便的主题材料,可是搞了本身一晌午哟。。。

     1 if(ui->bt_replay->text()=="回放") 2 { 3     auto name=QFileDialog::getOpenFileName(0,"","","pcap文件"); 4     QTextCodec *code = QTextCodec::codecForName("gb2312");//解决中文路径问题 5     string namestd = code->fromUnicode.data(); 6     cout<<"convert gb2312:"<<namestd<<endl; 7     if(namestd!="") 8     { 9         lctrl.replay_dat;10         ui->bt_replay->setText("退出回放");11         lctrl.replay_stat=1;12         ui->lb_replay_stat->setText("加载数据");13     }14 }
    

              整个代码如下:

    对此路线中设有空格的,在网络查的消除格局是:path.replace(" ","" "");

    <?php
    error_reporting(-1);
    $fromDir = 'G:测试b';
    $toDir = 'G:测试a';
    $fromDir = changeEncoding($fromDir);
    $toDir = changeEncoding($toDir);
    //由于可能出现中文乱码,所以必须全部通过changeEncoding函数处理
    if(!is_dir($fromDir)) {
        echo 'fromDir is not a valid dir';
        exit();
    }
    if(!is_dir($toDir)) {
        echo 'toDir is not a valid dir';
        exit();
    }
    function changeEncoding($str) {
        if(mb_check_encoding($str,'UTF-8')) {
            //只有UTF-8编码的时候才进行转码
            return mb_convert_encoding($str,"GBK","UTF-8");
        }
        return $str;
        //return iconv('UTF-8','GBK',$str);
    }
    $queue = array(
        '/'
    );
    while(count($queue) > 0) {
        $dirPath = array_shift($queue);
        if(null !== $dirPath) {
            if($handle = opendir($fromDir . $dirPath)) {
                while(false !== ($fileName = readdir($handle))) {
                    if(('.' !== $fileName) && ('..' !== $fileName)) {
                        $fileName = changeEncoding($fileName);
                        if("" !== $fileName) {
                            $filePath = $dirPath . $fileName;
                            $absFromPath = $fromDir . $filePath;
                            $absToPath = $toDir . $filePath;
                            if(file_exists($absFromPath)) {
                                if(is_dir($absFromPath)) {
                                    if(".svn" !== $fileName) {
                                        //去除SVN文件
                                        if(!file_exists($absToPath)) {
                                            //保证可以建文件夹成功
                                            mkdir($absToPath,0777);
                                        }
                                        array_push($queue,$filePath . '/');
                                    }
                                } else {
                                    //文件,判定是否最新
                                    if(!file_exists($absToPath) || (filemtime($absFromPath) > filemtime($absToPath))) {
                                        copy($absFromPath,$absToPath);
                                    }
                                }
                            }
                        }
                    }
                }
                closedir($handle);
            }
        }
    }
    echo 'copy successfully !';
    

    结果试了那三个,最终开掘,fopen本人就扶助带空格的文件名输入,没有供给转移……

    本文由澳门402永利com发布于编程应用,转载请注明出处:QT张开文件路线中饱含普通话和空格难点,写一个

    关键词: