none
c++文件操作中能不能根据用户输入自动创建一个不存在的文件夹 RRS feed

  • 问题

  • 我用c++编写了一个简单的有关文件操作的程序如下(把“hello world!”存放到一个给定的文件中)
    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    int main()
    {
     string so;
     ofstream o;
     cout<<"请输入保存路径:";
     cin>>so;
     o.open(so.c_str());
     o<<"hello world!"<<endl;
     o.close();
     return 0;
    }
    c盘上有个文件夹“sample”,当输入保存路径“c:\samples\test.txt”时候程序正常运行,但是当把保存的文件放到一个存在的文件夹中的时候,例如:输入保存路径“c:\ssss\test.txt”(ssss是一个不存在的文件夹)则程序不能自动建立一个名为ssss的文件夹。
    有没有什么方法可以使程序根据用户输入自动创建一个不存在的文件夹?
    • 已移动 Raymond TangModerator 2010年1月11日 3:40 (发件人:.NET Framework 一般性问题讨论区)
    2010年1月9日 2:29

答案

  • 自己创建,系统不会自动创建。
    如果未创建的文件夹有多层,每层都要自己创建,比如下面代码
    void CreateFolder(const char* folder)
    {
    	if (::GetFileAttributes(folder)==DWORD(-1))
    	{
    		string str = folder;
    		int npos = str.rfind("/");
    		int npos1 = str.rfind("\\");
    		if (npos != -1 || npos1 != -1)
    //		if (npos != -1)//有上级目录
    		{
    			if ( (npos == -1) ||(npos != -1 && npos1>npos))
    				npos = npos1;
    
    			string str1 = str.substr(0,npos);
    			CreateFolder(str1.c_str());
    		}
    		SECURITY_ATTRIBUTES attribute;
    		attribute.nLength = sizeof(attribute);
    		attribute.lpSecurityDescriptor = NULL;
    		attribute.bInheritHandle = FALSE;	
    		::CreateDirectory(str.c_str(),&attribute);
    	}
    	
    }
    2010年1月11日 6:58

全部回复

  • 自己创建,系统不会自动创建。
    如果未创建的文件夹有多层,每层都要自己创建,比如下面代码
    void CreateFolder(const char* folder)
    {
    	if (::GetFileAttributes(folder)==DWORD(-1))
    	{
    		string str = folder;
    		int npos = str.rfind("/");
    		int npos1 = str.rfind("\\");
    		if (npos != -1 || npos1 != -1)
    //		if (npos != -1)//有上级目录
    		{
    			if ( (npos == -1) ||(npos != -1 && npos1>npos))
    				npos = npos1;
    
    			string str1 = str.substr(0,npos);
    			CreateFolder(str1.c_str());
    		}
    		SECURITY_ATTRIBUTES attribute;
    		attribute.nLength = sizeof(attribute);
    		attribute.lpSecurityDescriptor = NULL;
    		attribute.bInheritHandle = FALSE;	
    		::CreateDirectory(str.c_str(),&attribute);
    	}
    	
    }
    2010年1月11日 6:58
  • 谢谢你

    2010年1月11日 14:26