从路径中提取文件名
Extracting a file name from the path
好的,我有以下内容:
wchar_t **filePathList;
保存正在添加到列表框中的文件列表。问题是它们显示了整个文件路径,而我只想得到文件名。我想过使用:
wchar_t *tempChar;
从filePathList的末尾开始,并返回,直到我得到一个。问题是我不确定该如何处理。这是我目前得到的代码:
afx_msg void Send::OnDropFiles(HDROP hDropInfo)
{
if(uploadInProgress)
{
MessageBox(L"Please wait for current upload to finish before adding files", L"Upload in progress", MB_OK);
return;
}
int len;
int prevNFiles = nFiles;
wchar_t **buffer = filePathList;
wchar_t *tempChar = NULL;
// get number of files dropped into window
nFiles += DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
filePathList = (wchar_t**)malloc(nFiles*sizeof(wchar_t*));
if(!filePathList)
{
MessageBox(L"FilePath list memory allocation failed", L"Error");
nFiles = 0;
if(buffer)
{
for(int i=0; i<prevNFiles; i++)
{
if(buffer[i]) free(buffer[i]);
}
free(buffer);
}
return;
}
memset(filePathList, 0, nFiles*sizeof(wchar_t*));
// get file names
for(int i=0; i<nFiles; i++)
{
if(i < prevNFiles)
{ // previously entered files
filePathList[i] = buffer[i];
continue;
}
// newly dropped files
len = DragQueryFile(hDropInfo, i-prevNFiles, NULL, 0)+1; // 1 for
tempChar = (wchar_t*)malloc(len*sizeof(wchar_t));
filePathList[i] = (wchar_t*)malloc(len*sizeof(wchar_t));
int index = len;
// Attempting to iterate through the path to get the file name
while(filePathList[i][index] != '')
{
tempChar = filePathList[index];
index--;
}
filePathList[i] = tempChar;
if(!filePathList[i])
{
MessageBox(L"FilePath memory allocation failed", L"Error");
for(int j=0; j<i; j++)
{
if(filePathList[j]) free(filePathList[j]);
}
free(filePathList); filePathList = NULL;
nFiles = 0;
break;
}
len = DragQueryFile(hDropInfo, i-prevNFiles, filePathList[i], len);
}
if(buffer) free(buffer);
// display files
UpdateFileListDisplay();
}
问题是Visual Studio将tempChar报告为"坏的ptr"。我承认在编程方面我还是个新手,对指针知之甚少,更不用说双指针了。但是任何帮助都会非常感激。谢谢你。
您正在处理的函数有76行。这并不是灾难性的长,但它已经到了难以推理的地步。将这个函数分成几个较小的函数可能是值得的。您正在解决的一个问题是如何从完整路径中提取文件名。你可以用这样的签名写一个函数:
char *filename_from_path(const char *fullpath);
,它接受一个完整的路径并返回一个只包含文件名的新字符串。(注意:你必须小心谁分配和释放文件名字符串)。像这样分解一个函数的妙处是,对于如何做小的子部分,通常有很好的建议:
使用MSVS2005从C的全路径中提取文件名,例如
分离逻辑将使你更容易推断出你正在处理的更大的循环。
错误在这段代码中:
tempChar = (wchar_t*)malloc(len*sizeof(wchar_t));
filePathList[i] = (wchar_t*)malloc(len*sizeof(wchar_t));
int index = len;
// Attempting to iterate through the path to get the file name
while(filePathList[i][index] != '')
{
tempChar = filePathList[index];
index--;
}
这里有几个问题:
-
len
不包括空终止符,因此您没有分配足够的内存。你还需要一个字符。 - 第二次调用
DragQueryFile
填充缓冲区失败。 - 第一次访问
filePathList[i][index]
是越界的,因为index
超出了数组的末尾。 - 由于
filePathList[i]
没有初始化,循环可能计数到index
为0,然后产生访问冲突。 - 即使你修复了所有这些错误,你也需要在循环中测试
index>=0
,以防字符串不包含路径分隔符。
我没有看过你的问题中的任何其他代码,但我愿意打赌,我没有发现所有的错误。这应该足够了。
Joachim关于使用_splitpath
的建议是非常合理的,但另一方面,你真的需要掌握这种类型的编码
您也可以打开文件查找它的名称。尽管这可能和遍历路径一样慢
相关文章:
- 从命令行c++发送文本文件名
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何设置一个范围来提取我想要获得的信息
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从 C++ 中的文件路径中提取文件名
- 使用boost::filesystem和boost::lexical_cast从文件名中提取数字
- 从文件名中提取文件名,路径来自参数
- 提取所有文件名 - 查找第一个文件
- 提取具有给定后缀的文件名部分C++
- 从路径中提取文件名
- 提取文件名的子字符串
- 从文件名中提取数字
- 使用QRegExp从URL中提取文件名
- 如何从文本文件中提取扩展名为.txt的文件名