我有一个c:\config文件夹,其中包含几个配置文件(config_x)。我希望能够随机选择其中一个(程序是用C编写的)。文件数量将来可能会更改,因此需要能够查询文件夹中的文件数量。
如何做到这一点?
- 使用
FindFirstFile
和FindNextFile
生成文件夹中文件的列表 - 生成一个介于0和文件数之间的随机数,然后从列表中选择该索引
MSDN提供了一个列出文件的示例。
在循环中使用FindFirstFile
和FindNextFile
。记下到目前为止您看到的文件数量(n
)。在每个循环中,随机爆发1:n
机会:
if(INVALID_HANDLE_VALUE!=(hFind = FindFirstFile(DirSpec, &FindFileData))) {
for(i=0;;++i) {
strcpy(fileChoice, FindFileData.cFileName);
while(rand_s(&r));
if( ((double)r) / ((double)i) < 1.0 ) break;
if(!FindNextFile(hFind, &FindFileData)) break;
}
}
你可以在Donald E.Knuth的《计算机编程艺术》第2卷第3.4.2节中找到这种方法的证明。