搜索具有UNICODE名称的文件
Search files with UNICODE names
编译成功后,我尝试编译这个程序,它会在控制台窗口中打印程序的当前目录。但这个程序的工作是向我展示所有扩展名为.doc的文件,而且当我不使用宽字符串wstring()
时,它也能很好地工作。所以这就是我想用wstring功能编译这个程序的问题。
更新:
此代码工作正常:
#define UNICODE
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <windows.h>
#include <conio.h>
using namespace std;
/*
#define UNICODE
#define _UNICODE
typedef std::string UTF8String;
*/
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;
}
// Prototype for conversion functions
std::wstring StringToWString(const std::string& s);
std::string WStringToString(const std::wstring& s);
std::wstring StringToWString(const std::string& s)
{
std::wstring temp(s.length(),L' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
std::string WStringToString(const std::wstring& s)
{
std::string temp(s.length(), ' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
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, "c:", "doc");
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Print results
for(std::vector<std::wstring>::iterator iterAvi = vecAviFiles.begin(); iterAvi != vecAviFiles.end(); ++iterAvi)
std::wcout << *iterAvi << std::endl;
}
<小时>不工作代码:
#include <string>
#include <vector>
#include <iostream>
#include <windows.h>
#include <conio.h>
int SearchDirectory(std::vector<std::wstring> &refvecFiles,
const std::wstring &refcstrRootDirectory,
const std::wstring &refcstrExtension,
bool bSearchSubdirectories = true)
{
std::wstring strFilePath; // Filepath
std::wstring strPattern; // Pattern
std::wstring strExtension; // Extension
HANDLE hFile; // Handle to file
WIN32_FIND_DATAW FileInformation; // File information
strPattern = refcstrRootDirectory + L"\*.*";
hFile = ::FindFirstFileW(strPattern.c_str(), &FileInformation);
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
if(FileInformation.cFileName[0] != '.')
{
strFilePath.erase();
strFilePath = refcstrRootDirectory + L"\" + 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(L".") + 1);
if(strExtension == refcstrExtension)
{
// Save filename
refvecFiles.push_back(strFilePath);
}
}
}
} while(::FindNextFileW(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::wstring> vecAviFiles;
// Search 'c:' for '.avi' files including subdirectories
iRC = SearchDirectory(vecAviFiles, L"c:", L"doc");
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}
// Print results
for(std::vector<std::wstring>::iterator iterAvi = vecAviFiles.begin(); iterAvi != vecAviFiles.end(); ++iterAvi)
std::wcout << *iterAvi << std::endl;
}
我想知道的是为什么第二个程序不起作用?
小时>你做错了™.
考虑strPattern = refcstrRootDirectory + L"\*.*";
。*.*
存在是有原因的。它是您指定要查找的文件模式的位置。如果你想查找*.doc
文件,可以这样说:strPattern = refcstrRootDirectory + L"\*." + refcstrExtension;
此外,还有一些风格说明:
- 删除类型前缀。这是弱类型语言中使用的约定;C++是强类型的
- 在需要的地方定义变量,而不是更早:
std::wstring Pattern = RootDirectory + L"\*.*";
HFILE File = ::FindFirstFileW(Pattern.c_str(), &FileInformation);
- 如果您正在分配一个新值,则无需擦除字符串。例如,这很好用。
FilePath = RootDirectory + L"\" + FileInformation.cFileName;
- 检查这对没有扩展名的文件的影响
- 您正在泄露
if(iRC) return iRC;
中的文件句柄。(C++对象是自动清理的,但这是一个C API)
相关文章:
- 在特定 Unicode 路径中创建文件
- 如何存储 unicode 字符并将其输出到文件?
- C++如何通过忽略每行的第一个字符来读取 unicode 文件
- C++:如何将 unicode 字符打印到文本文件
- Linux Ubuntu 中的文件内输出 unicode 符号
- 使用 Imread 打开具有 Unicode 名称的图像文件
- 将 Unicode 字符/字符串写入文件
- 将 Unicode 字符存储在.txt文件中的新行中
- 读取 CSV 文件(UNICODE 编码)C++时出现编码错误
- 无法将 Unicode(希腊语)字符保存到文件中
- 如何在 c++ 中调用 unicode 函数 CreateProcessW 来启动 Windows 可执行文件
- 无法读取使用Unicode的文件(存在)
- 如何将 unicode 文本打印到输出文件?
- 从包含Unicode字符的文件中读取
- 使用C++的可视 Unicode 文件函数
- C/C++ 将编码设置为 UNICODE。如何将'ă'写入文件
- 在C/C++中将文件重命名为unicode名称
- 将Unicode的UTF8表示形式写入文件
- 如何将Unicode CString(日语)打印到文本文件中
- 重命名文件夹内的文件- Unicode等效函数