Visual c++ 在Visual C++;

Visual c++ 在Visual C++;,visual-c++,directory-listing,Visual C++,Directory Listing,我试图“简化”一段很好的示例代码,该代码的超链接位于该消息的末尾,用于指定目录字符串,而不是将其作为命令行参数传递。简化的代码可以编译和执行,但文件名和大小不是我所期望的:文件名似乎是一个十六进制数,nFileSize.High大于nFileSize.Low(实际文件大小从0到100Mb不等)。我认为我的类型转换可能引入了错误。有什么建议吗 #include "stdafx.h" #include <iostream> #include <fstream> #includ

我试图“简化”一段很好的示例代码,该代码的超链接位于该消息的末尾,用于指定目录字符串,而不是将其作为命令行参数传递。简化的代码可以编译和执行,但文件名和大小不是我所期望的:文件名似乎是一个十六进制数,nFileSize.High大于nFileSize.Low(实际文件大小从0到100Mb不等)。我认为我的类型转换可能引入了错误。有什么建议吗

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
#include <bitset>
#include <sstream>
#include <windows.h>
#include <tchar.h> 
#include <stdio.h>
#include <strsafe.h>
#pragma comment(lib, "User32.lib")
using namespace std; 
using namespace System;  //set common language runtime support to /clr

int main()
{
   WIN32_FIND_DATA ffd;
   LARGE_INTEGER filesize;
   //TCHAR szDir[MAX_PATH];
   //size_t length_of_arg;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   //DWORD dwError=0;

    finstr = "C:\\Users\\MyName\\Documents\\Visual Studio 2010\\Projects\\Data Analysis\\Data Folder\\*";

   //Just evaluate the first file before looping over all files
   hFind = FindFirstFile((wchar_t*)(finstr.c_str()), &ffd);

   wstring wsfname(ffd.cFileName);
   string newtemp(wsfname.begin(), wsfname.end());
   cout << "1st fname = " << ffd.cFileName << "   newtemp = "<< newtemp << "   nFSizeLo = "<< ffd.nFileSizeLow << "   nFSizeHi = "<< ffd.nFileSizeHigh << "\n";

   FindClose(hFind);
   return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“User32.lib”)
使用名称空间std;
使用名称空间系统//将公共语言运行时支持设置为/clr
int main()
{
WIN32_查找_数据ffd;
大整数文件大小;
//TCHAR szDir[MAX_PATH];
//参数的大小和长度;
句柄hFind=无效的句柄值;
//DWORD dwError=0;
finstr=“C:\\Users\\MyName\\Documents\\visualstudio 2010\\Projects\\Data Analysis\\Data Folder\\*”;
//在循环所有文件之前,只需计算第一个文件
hFind=FindFirstFile((wchar_t*)(finstr.c_str()),&ffd);
wstring wsfname(ffd.cFileName);
字符串newtemp(wsfname.begin(),wsfname.end());

我想您在字符串转换中可能有问题。请尝试:1.
wstring wsfname(CT2A(ffd.cFileName,CP_UTF8));
2.删除下一行3.将
cout
替换为
wcout
并改用
wsfname
。使其成为
wstring finstr=L“C:\\Users…”
(注意
L
前缀)并在
FindFirstFile
调用中删除强制转换:
FindFirstFile(finstr.c_str(),&ffd)
。一般来说,避免混合和匹配窄字符串和宽字符串;尽可能使用Unicode。您的
FindFirstFile
调用失败,但您不知道这一点,因为您没有检查其返回值。然后检查未初始化的
ffd
中碰巧存在的随机垃圾,我认为您在stri正在转换。尝试:1.
wstring wsfname(CT2A(ffd.cFileName,CP_UTF8));
2.删除下一行3.将
cout
替换为
wcout
,并改用
wsfname
。使其成为
wstring finstr=L“C:\\Users…”;
(注意
L
前缀)并在
FindFirstFile
调用中删除强制转换:
FindFirstFile(finstr.c_str(),&ffd)
。通常,避免混合和匹配窄字符串和宽字符串;尽可能使用Unicode。您的
FindFirstFile
调用失败,但您不知道这一点,因为您没有检查它的返回值。然后检查未初始化的
ffd