Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在labwindows cvi应用程序中调用FindNextFile时,cFileName为空_C_Windows_64 Bit_Cvi - Fatal编程技术网

在labwindows cvi应用程序中调用FindNextFile时,cFileName为空

在labwindows cvi应用程序中调用FindNextFile时,cFileName为空,c,windows,64-bit,cvi,C,Windows,64 Bit,Cvi,我目前正在开发一个cvi应用程序,需要检索当前构建目录中的每个.wav文件。为了在C中实现这一点,我在以下函数中使用windows内置函数FindFirstFIle和FindNextFile: int listingWavFileNameInDirectory( char projectDirectory[MAX_PATHNAME_LEN], int numberOfWavFile, char **ListOfWavFile) { WIN32_FIND_DATA searchingFil

我目前正在开发一个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文件(ListOfAvFile[0]具有正确的字符串),但不适用于通过FindNextFile获取并包含ListOfAvFile[i]的其他文件名。ListOfAvFile[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); 
GetProjectDir(projectDirectory);
numberOfWavFile=countingWavFileInDirectory(项目目录);
listOfWavFile=malloc(numberOfWavFile*sizeof(char*);
对于(int i=0;i
我使用的是64位windows 7,我的应用程序编译为64位应用程序。我尝试使用Wow64DisableWow64FsRedirection,如中所述,但它对我不起作用


有什么想法吗?

除了@ooga对strcpy()的评论之外,这一行还缺少一个

while(FindNextFile(handleFind, &searchingFile)
您应该针对未使用的参数
numberOfWavFile
进行范围检查
i
。好的,您首先找到了.wav文件的数量,但在解析文件夹时,这可能已经改变了。当涉及到阵列使用时,不作任何假设。所以上面的一行应该是

while (FindNextFile(handleFind, &searchingFile) && i < numberOfWavFile)
while(FindNextFile(handleFind和searchingFile)和&i
在LabWindows/CVI中,您必须

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

这不是

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

a = b;  //Not OKAY  
改用strcpy:

strcpy(a, b);  //the correct way
因此,在代码中进行以下更改:
(假设
ListOfWavFile
是一个已正确初始化和分配内存的
char**

将编译警告设置为最大值。
在CVI中,它看起来是这样的(或类似的,取决于版本):

您需要
strcpy
这些文件名,而不仅仅是使用
=
。除了少数例外,C中的字符串(字符数组)不能使用
=
运算符赋值。正如ooga所说,您必须使用函数。最常见的
strcpy()
用于像您这样的场景。感谢C课程,这是您在工作中学习的内容!我会接受你的回答,但我还有一个问题:你有没有解释为什么它第一次起作用但不在第二个中?@NessyW.-我不确定您是如何声明ListOfAvFile的。根据具体方式,可能会提供以下方面的解释:。它可能与以下行有关:
while(FindNextFile(handleFind,&searchingFile)
(您需要另一个
)。如果看不到更多,我不能肯定。但将编译警告设置为完整。(见编辑中的图片)
strcpy(a, b);  //the correct way
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++;
}