怎么读出指定文件夹下的所有文件名并返回字符串数组

如何读出指定文件夹下的所有文件名并返回字符串数组?
我想要在c++下面实现这样的功能,输入文件夹名,打开该文件夹,读出这个文件夹下的所有文件名,用字符串数组保存,返回主函数,根据不同的文件名逐一处理。
好象这样:
#include "stdafx.h"
char ** filesname(char * foldname)//取得文件夹下的文件列表
{
//读出文件夹下的所有文件,返回文件列表
}
int main(int argc, char **argv)
{
char * foldername=argv[1];//取得文件夹名
char ** filesname(foldername); //取得文件列表
for(i=0;i<filename.size();i++) //取得文件夹下的文件个数,这样好像不太对
{
file=filesname[i]; //取得一个文件名
//处理文件
}
}

我主要是不知道怎么返回一个字符串数组和怎么读取文件夹下的所有文件。还望大家不吝赐教。谢谢!

------解决方案--------------------
C/C++ code

#include <windows.h>

WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
hFind = FindFirstFile(foldname, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
    cout << "Invalid file handle."<< endl;
    return (-1);
}
while (FindNextFile(hFind, &FindFileData) != 0) 
{
    strcpy(filename,FindFileData.cFileName);
}
FindClose(hFind);

------解决方案--------------------
你可以使用string*来存储,效率会高些
不过最后要进行delete

C/C++ code

int main() 
{ 
    vector<string> vFileNames;
    vector<string*> vFileNames;
    //string* pStr = NULL;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = ::FindFirstFile("d:\\*.*", &FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)
        return 0;
    while(TRUE)
    {
        //pStr = new string(FindFileData.cFileName);
        //vFileNames.push_back(pStr);
        vFileNames.push_back(FindFileData.cFileName);
        if(!FindNextFile(hFind, &FindFileData))
            break;
    }
    FindClose(hFind);     
    // delete
    return 0; 
}

------解决方案--------------------
#include <afx.h>
#include <iostream.h>


int main()
{
CFileFind finder;
CString strDirectionName = _T( "C:\\Program Files\\*.*" );
BOOL bWorking = finder.FindFile(strDirectionName);
CStringArray ArrayFileName;
while (bWorking)
{
bWorking = finder.FindNextFile();
CString strFileName = finder.GetFileName();
ArrayFileName.Add(strFileName);
}
for ( int i = 0; i< ArrayFileName.GetSize(); i++ )
{
cout << ArrayFileName.GetAt(i) << endl;
}

return 0;
}
------解决方案--------------------
我来大概写一个用ace底层库的,既然事c++就要考虑多个平台
C/C++ code

char lpc_path[32] = {0};//表示绝对路径
#ifdef WIN32

    
    ACE_DIR *root = ACE_OS::opendir( lpc_Path );
    if ( !root )///////////////////////////////////////////////////////////////////////////
    {
        return吧
    }
    while (ACE_OS::readdir(root))
    {
        if (!(root->fdata_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
           //这边保留root->dirent_->d_name就事文件名了 
        }
    }
    ACE_OS::closedir(root);
#else
    sprintf( lpc_Path, "%s/%s", HISDATA_FTP_PATH, lpc_Date );
    DIR*   dp;   
    struct   dirent*   dirp;   
    if( (dp=opendir(lpc_Path))==NULL )
    {
                return 吧;
    }
    while((dirp=readdir(dp))!=NULL)   
    {
        保留 dirp->d_name
}


    closedir(dp); 
#endif