私はこのソースコードをネット上のどこかから入手しました。これは、ハードディスク上のファイルを検索し、ファイルのパスを出力します:Windowsでアラビア語のファイル名を扱うにはどうすればよいですか?
#include <string>
#include <vector>
#include <iostream>
#include <windows.h>
#include <conio.h>
int SearchDirectory(std::vector<std::string> &refvecFiles,
const std::string &refcstrRootDirectory,
const std::string &refcstrExtension,
bool bSearchSubdirectories = true)
{
std::string strFilePath; // Filepath
std::string strPattern; // Pattern
std::string strExtension; // Extension
HANDLE hFile; // Handle to file
WIN32_FIND_DATA FileInformation; // File information
strPattern = refcstrRootDirectory + "\\*.*";
hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
if(FileInformation.cFileName[0] != '.')
{
strFilePath.erase();
strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName;
if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(bSearchSubdirectories)
{
// Search subdirectory
int iRC = SearchDirectory(refvecFiles,
strFilePath,
refcstrExtension,
bSearchSubdirectories);
if(iRC)
return iRC;
}
}
else
{
// Check extension
strExtension = FileInformation.cFileName;
strExtension = strExtension.substr(strExtension.rfind(".") + 1);
if(strExtension == refcstrExtension)
{
// Save filename
refvecFiles.push_back(strFilePath);
}
}
}
} while(::FindNextFile(hFile, &FileInformation) == TRUE);
// Close handle
::FindClose(hFile);
DWORD dwError = ::GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
return dwError;
}
return 0;
}
int main()
{
int iRC = 0;
std::vector<std::string> vecAviFiles;
std::vector<std::string> vecTxtFiles;
// Search 'c:' for '.avi' files including subdirectories
iRC = SearchDirectory(vecAviFiles, "d:", "doc");
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Print results
for(std::vector<std::string>::iterator iterAvi = vecAviFiles.begin();
iterAvi != vecAviFiles.end();
++iterAvi)
std::cout << *iterAvi << std::endl;
// Search 'c:\textfiles' for '.txt' files excluding subdirectories
/*
iRC = SearchDirectory(vecTxtFiles, "c:\\textfiles", "txt", false);
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Print results
for(std::vector<std::string>::iterator iterTxt = vecTxtFiles.begin();
iterTxt != vecTxtFiles.end();
++iterTxt)
std::cout << *iterTxt << std::endl;
// Wait for keystroke
_getch();
*/
return 0;
}
問題は、それがアラビア語のテキストとファイル名を見つけたとき、それを正しく表示されないということです。それはちょうど"?????????????????????"
を示しています。私はサーバーに送るファイルパスが必要です。とにかく問題を解決するには?
更新日: 私はコードを改訂しました。次のように
新しいコードは次のとおりです。
#include <boost/filesystem.hpp>
namespace bf = boost::filesystem;
#include <string>
#include <iostream>
using namespace std;
string e_string = "Error";
int main()
{
string fileName = "C:\\حم.txt";
string destination = "D:\\log.txt" ;
bf::path fileCopied(fileName);
bf::path fileCopiedDestination (destination);
if (!bf::exists(fileCopied))
{
cerr << e_string;
}
if (!bf::exists(fileCopiedDestination))
{
cerr << e_string;
}
try
{
bf::copy_file(fileCopied,fileCopiedDestination);
}
catch(std::exception e)
{
cout << e.what();
}
}
このコードはコンパイルが、私はこのエラーを取得:
ErrorErrorstd::exception
また、コピー処理は失敗します。
string fileName = "C:\\??.txt";
無駄だった:
string fileName = "C:\\حم.txt";
へ:
私はこの行を変更しようとしました。このファイルをコピーするにはどうすればよいですか?
アラビアファイル名原因となる問題 – pourjour