0

好的,我有以下内容:

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 \0
        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”。我承认我在编程方面仍然很年轻,对指针知之甚少,更不用说双指针了。但任何帮助将不胜感激。谢谢你。

4

3 回答 3

3

您正在使用的函数是 76 行长。这不是灾难性的长,但它已经到了难以推理的地步。将这个函数分成几个较小的函数可能是值得的。您正在处理的一个问题是如何从完整路径中提取文件名。您可以编写一个带有如下签名的函数:

char *filename_from_path(const char *fullpath);

它采用完整路径并返回一个仅包含文件名的新字符串。(注意:您必须小心谁分配和释放文件名字符串)。分解这样一个函数的巧妙之处在于,通常有关于如何做小子部分的好建议:

例如,使用 MSVS2005 从 C 中的完整路径中提取文件名。

分离出该逻辑将使您更容易推理您正在处理的更大循环。

于 2011-12-20T21:06:56.420 回答
1

错误出现在这段代码中:

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--;
}

这里有几个问题:

  1. len不包括空终止符,因此您没有分配足够的内存。你还需要一个角色。
  2. 您未能再次调用DragQueryFile以填充缓冲区。
  3. 您的第一次访问filePathList[i][index]超出范围,因为index超出了数组的末尾。
  4. 由于filePathList[i]未初始化,循环可能会倒数到index0,然后产生访问冲突。
  5. 即使您修复了所有这些错误,您也需要index>=0在循环中进行测试,以防字符串不包含路径分隔符。

我没有查看您问题中的任何其他代码,但我敢打赌我没有找到所有错误。现在应该足够了。

Joachim 的使用建议_splitpath非常合理,但另一方面,您确实需要掌握这种类型的编码。

于 2011-12-20T20:58:32.770 回答
0

您也可以打开文件以找到它的名称。尽管这可能与通过路径一样慢。

于 2011-12-20T21:19:41.760 回答