1

对于我在论坛上的第一篇文章,因为我是一个真正的初学者,我看不出我的错误来自哪里。在用户选择文件夹中的多个文件后,我尝试将它们重命名为“image_1.jpg”、“image_2.jpg”等......我认为我的代码很好,但我可能做错了,因为它没有重命名,因为 hFind 总是 INVALID_HANDLE_VALUE。你能帮我看看这是从哪里来的吗?非常感谢!!

#include "stdafx.h"
#include "Accueil.h"
#include <iostream>
#include <string>
#include <math.h>
#include "calib_cam_relative.h"
#include "calib_las_veh.h"
#include "calib_cam_las.h"
#include "calib_interne.h"
#include <stdio.h>
#include <strsafe.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <windows.h>
#include<shellapi.h>
#include<conio.h> 


                     string cam;
         if(radioButton1->Checked == true){
             cam="CDB";
         }else if(radioButton2->Checked == true){
             cam="CDH";
         }else if(radioButton3->Checked == true){
             cam="CGB";
         }else if(radioButton3->Checked == true){
             cam="CGH";
         }

         string sfol;
         ifstream fich_chemin("chemin.txt");
         getline(fich_chemin,sfol); 
         fich_chemin.close();

         WIN32_FIND_DATA ffd;
         string Dossier = sfol+"\\calib_interne\\TOOLBOX_calib\\" + cam + "\\*.jpg";
         cout << Dossier << endl;
         TCHAR* dirname =  (TCHAR*)Dossier.c_str();
         HANDLE hFind;
         hFind = FindFirstFile((LPCWSTR)Dossier.c_str(), &ffd);
         if (hFind == INVALID_HANDLE_VALUE){
             cout << "erreur" << endl;
         }
         LPTSTR oldfilename;
         TCHAR newfile[260];
         LPTSTR newfilename = &newfile[0];

         int i=1;
         while (FindNextFile(hFind, &ffd)!=0)
         {
            cout << "le premier fichier est " << ffd.cFileName << endl;
            oldfilename=ffd.cFileName;
            StringCchPrintf(newfilename,8,TEXT("%s\\image_%d.jpg"),dirname, i);
            BOOL rs = MoveFile(oldfilename,newfilename);
            i++;
         }
         FindClose(hFind);

感谢您的回答!这是解决方案!

string cam;
             if(radioButton1->Checked == true){
                 cam="CDB";
             }else if(radioButton2->Checked == true){
                 cam="CDH";
             }else if(radioButton3->Checked == true){
                 cam="CGB";
             }else if(radioButton4->Checked == true){
                 cam="CGH";
             }else if(radioButton5->Checked == true){
                 cam="CF";
             }

             string sfol;
             ifstream fich_chemin("chemin.txt");
             getline(fich_chemin,sfol); 
             fich_chemin.close();

             WIN32_FIND_DATAA ffd;
             HANDLE hFind;
             string Dossier = sfol+"\\calib_interne\\TOOLBOX_calib\\" + cam + "\\*.jpg";
             //string Dossier = "D:\\*.jpg";
             TCHAR* dirname =  (TCHAR*)Dossier.c_str();
             hFind = FindFirstFileA((LPCSTR)Dossier.c_str(), &ffd);
             int i=1;
             ostringstream oss;
             oss << i;
             string iss = oss.str();
             string newfilename = sfol + "\\calib_interne\\TOOLBOX_calib\\" + cam + "\\image_" + iss + ".jpg";
             string oldfilename = sfol + "\\calib_interne\\TOOLBOX_calib\\" + cam + "\\" + ffd.cFileName;
             BOOL rs = MoveFileA((LPCSTR)oldfilename.c_str(),(LPCSTR)newfilename.c_str());
             /*if (rs == 0){
                 DWORD dw = GetLastError(); 
                 cout << dw << endl;
             }*/
            while (FindNextFileA(hFind, &ffd)!=0)
            {
                i++;
                ostringstream oss;
                oss << i;
                iss = oss.str();
                newfilename = sfol + "\\calib_interne\\TOOLBOX_calib\\" + cam + "\\image_" + iss + ".jpg";
                oldfilename = sfol + "\\calib_interne\\TOOLBOX_calib\\" + cam + "\\" + ffd.cFileName;
                BOOL rs2 = MoveFileA((LPCSTR)oldfilename.c_str(),(LPCSTR)newfilename.c_str());
                cout << rs2 << endl;
             }
             FindClose(hFind);
4

2 回答 2

2

string总是由 组成char。所以你的代码

     TCHAR* dirname =  (TCHAR*)Dossier.c_str();

仅在使用多字节字符集编译时才有效,而不是在使用 Unicode 字符集编译时有效。您的下一行也不起作用:

     hFind = FindFirstFile((LPCWSTR)Dossier.c_str(), &ffd);

string::c_str给你一个const char*. 从技术上讲,您可以将此指针转换为 a LPCWSTR,但这只会更改指针,而不是它指向的字符串。由于 Unicode 版本FindFirstFile要求您提供 Unicode 字符串,因此这种转换没有任何意义。

你也可以

  • 使用多字节字符集编译或
  • 使用 Unicode 字符集编译并使用 ANSI 模式函数(将尾随“A”添加到 Windows API 函数)或
  • 使用 Unicode 字符集编译并使用wstring,而不是stringor
  • 看看 string 和 wstring 是如何进行 typedef 的(两者都是模板的特化,一个使用 char,另一个使用 wchar_t)并定义您自己的 tstring(也是模板的特化,使用 TCHAR)
于 2013-06-26T09:32:11.430 回答
1

如果 FindFirstFile 返回 INVALID_HANDLE_VALUE,则调用 GetLastError()。该函数的返回会为您提供错误代码,这将帮助您找出 FindFirstFile 失败的原因。返回的错误代码将是其中之一

于 2013-06-25T10:26:53.213 回答