如何使用C++自动打开文件夹中的第一个文件?

6

如何在不知道文件名的情况下,从C++应用程序中自动打开并读取给定目录中文件的内容?

例如(程序的大致描述):

#include iomanip      
#include dirent.h     
#include fstream   
#include iostream   
#include stdlib.h

using namespace std;

int main()              
{
      DIR* dir;                                                   
      struct dirent* entry;                                          
      dir=opendir("C:\\Users\\Toshiba\\Desktop\\links\\");        
      printf("Directory contents: ");                             

      for(int i=0; i<3; i++)                                      
      {

           entry=readdir(dir);                                     
           printf("%s\n",entry->d_name);                           
      }
      return 0;
}

这将打印出该目录中第一个文件的名称。我的问题是如何读取该特定文件的内容并将其保存在一个 .txt 文件中。可以使用 ifstream 吗?(抱歉我的英语不好。)


7
你的英语并不像你想象的那样差。我开始注意到一个模式,那些足够谨慎为自己的语言技能道歉的人,通常也会足够谨慎地确保他们所问的问题一开始就很有意义。 - Cody Gray
2
“第一个文件”是什么?这显然取决于排序顺序。你可能希望查看boost::filesystem库。不过,我不知道有任何标准和跨平台的方法来做到这一点。 - Sergei Tachenov
我的意思是你有一个包含数千个文件的文件夹。我正在尝试编写一个仅使用C++的程序,逐个读取该文件夹中的文件,并将其内容复制到一个.txt文档中,然后保存它。这些过程将由程序自动完成。因此,用户只需执行程序即可。 - FCX
哦,顺便说一下,我正在使用 Windows Vista 上的 Code::Blocks C++。 - FCX
2个回答

5

这应该可以解决问题。

#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
using namespace boost::filesystem;
using namespace std;

void show_files( const path & directory, bool recurse_into_subdirs = true )
{
  if( exists( directory ) )
  {
    directory_iterator end ;
    for( directory_iterator iter(directory) ; iter != end ; ++iter )
      if ( is_directory( *iter ) )
    {
      cout << iter->native_directory_string() << " (directory)\n" ;
      if( recurse_into_subdirs ) show_files(*iter) ;
    }
    else
      cout << iter->native_file_string() << " (file)\n" ;
    copyfiles(iter->native_file_string());
  }
}

void copyfiles(string s)
{
  ifstream inFile;

  inFile.open(s);

  if (!inFile.is_open()) 
  {
    cout << "Unable to open file";
    exit(1); // terminate with error
  }
    //Display contents
  string line = "";

    //Getline to loop through all lines in file
  while(getline(inFile,line))
  {
    cout<<line<<endl; // line buffers for every line
        //here add your code to store this content in any file you want.
  }

  inFile.close();
}
int main()
{
  show_files( "/usr/share/doc/bind9" ) ;
  return 0;
}

1
如果你使用的是Windows系统,可以在Windows API中使用FindFirstFile。这里有一个简短的示例:
HANDLE myHandle;
WIN32_FIND_DATA findData;
myHandle = FindFirstFile("C:\\Users\\Toshiba\\Desktop\\links\\*", &findData);
do {
    if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
        cout << "Directoryname is " << findData.cFileName << endl;
    }
    else{
        cout << "Filename is " << findData.cFileName << endl;
    }
} while (FindNextFile(myHandle, &findData));

否则我会选择ayushs的答案,Boost也适用于Unix系统。

1
谢谢你的代码。它有效。我有另一个问题。程序打开并读取文件后,我无法使用system("move OldDirectory NewDirectory")将文件从一个目录移动到另一个目录。因为我不知道要移动的文件名。是否有任何方法可以像您在代码中提到的findData.cFileName一样使用它来将我的文件移动到新位置但保持相同的文件名?如果我的问题令人困惑,对不起。 - FCX
cFileName 不是文件的绝对路径,因此您需要将文件所在的目录设置为工作目录,或者将目录与文件名连接并将其用作 OldDirectory。另外,如果不想使用 system 而是继续使用 Windows API,请查看MoveFile - default

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接