1

我目前正在开发一个 cvi 应用程序,我需要在其中检索当前构建目录的每个 .wav 文件。为了在 C 中这样做,我在以下函数中使用 Windows 内置函数 FindFirstFIle 和 FindNextFile:

int listingWavFileNameInDirectory( char projectDirectory[MAX_PATHNAME_LEN], int numberOfWavFile, char **ListOfWavFile)
{
    WIN32_FIND_DATA searchingFile;
    HANDLE handleFind = NULL;
    char workingPath[2048];

    sprintf(workingPath, "%s\\*.wav*", projectDirectory);

    if( (handleFind = FindFirstFile(workingPath, &searchingFile)) != INVALID_HANDLE_VALUE)
    {
        ListOfWavFile[0] = searchingFile.cFileName;
        i = 1;
        while(FindNextFile(handleFind, &searchingFile)
        { 
            ListOfWavFile[i] = searchingFile.cFileName;
            i++;
        }
        if( !FindClose(handleFind))
            return GetLastError();

        return 0;
    }
    else
    {
        return GetLastError();
    }
}

此函数适用于第一个 wav 文件(ListOfWavFile[0] 具有正确的字符串),但不适用于通过 FindNextFile 获取并包含 ListOfWavFile[i] 的其他文件名。ListOfWavFile[i] 实际上是一个空字符串。我只是不明白为什么。这是我对前面函数的调用:

GetProjectDir(projectDirectory);
numberOfWavFile = countingWavFileInDirectory(projectDirectory);
listOfWavFile = malloc(numberOfWavFile * sizeof(char *));
for(int i = 0; i < numberOfWavFile; i++)
{
    listOfWavFile[i] = malloc(256 * sizeof(char));
}
listingWavFileNameInDirectory(projectDirectory, numberOfWavFile, listOfWavFile); 

我在 Windows 7 64 位上,我的应用程序被编译为 64 位应用程序。我尝试像在这个线程中所说的那样使用 Wow64DisableWow64FsRedirection ,但它对我不起作用。

有任何想法吗 ?

4

2 回答 2

1

在 LabWindows/CVI 中,您必须

#include <ansi_c.h>  //header collector for ansi C libraries included in CVI environment

为使以下建议起作用...

您必须使用字符串复制或连接函数将值分配给字符串,很少有例外。

在 C 中,除了在初始化时,您不能使用=运算符将​​值分配给char数组 ( char *a;, char a[];)。

例如,虽然类似:

char *a = {"this is an initialization string"};
//or
char a[] = {"this is an initialization string"};

完全没问题...

这不是

char a[80] = {0}; //okay
char b[] = {"this is a string"}; //okay still

a = b;  //Not OKAY  

使用 strcpy 代替:

strcpy(a, b);  //the correct way

因此,在您的代码中进行以下更改:(
假设ListOfWavFilechar **正确初始化并分配内存)

strcpy(ListOfWavFile[0], searchingFile.cFileName);//HERE
i = 1;
while(FindNextFile(handleFind, &searchingFile)) //note the addition of the last ")"
{ 
    strcpy(ListOfWavFile[i], searchingFile.cFileName);//And HERE
    i++;
}

将您的编译警告调到最大。
在 CVI 中,它看起来像这样(或类似,取决于版本):
在此处输入图像描述

于 2014-10-30T18:56:27.513 回答
0

In addition to @ooga's comment about strcpy(), there is a missing ) in this line

while(FindNextFile(handleFind, &searchingFile)

And you should be range-checking i against the argument numberOfWavFile which you haven't used. OK, you found out the number of .wav files first, but that may have changed by the time you parse the folder. Assume nothing when it comes to array usage. So the above line should read

while (FindNextFile(handleFind, &searchingFile) && i < numberOfWavFile)
于 2014-10-30T18:37:24.507 回答