删除不正常工作? (std命名空间)

时间:2011-07-13 09:41:21

标签: c++ visual-c++

通过此代码片段,我尝试从目录中删除某个文件。这是代码。

/* char* cpathToDeleteGND;  
   char* cpathToDeleteFST;
   char* cpathToDeleteSND;
 */

cout << "Enter the name to be removed : ";

cin.ignore();

getline( cin , fullName );

string pathToDeleteGND = "d:/HostelManager/studentDetails/groundFloor/" + fullName  + ".txt";

string pathToDeleteFST = "d:/HostelManager/studentDetails/firstFloor/" + fullName + ".txt";

string pathToDeleteSND = "d:/HostelManager/studentDetails/secondFloor/" + fullName + ".txt";


ifstream checkToDeleteGND( pathToDeleteGND );
ifstream checkToDeleteFST( pathToDeleteFST );
ifstream checkToDeleteSND( pathToDeleteSND );

cpathToDeleteGND = new char[ pathToDeleteGND.size() + 1 ];
cpathToDeleteFST = new char[ pathToDeleteFST.size() + 1 ];
cpathToDeleteSND = new char[ pathToDeleteSND.size() + 1 ];

strcpy( cpathToDeleteGND , pathToDeleteGND.c_str() );
strcpy( cpathToDeleteFST , pathToDeleteFST.c_str() );
strcpy( cpathToDeleteSND , pathToDeleteSND.c_str() );

if( checkToDeleteGND ) {
  if( remove( cpathToDeleteGND) == 0 ) {
   cout << "\nStudent details cleared successfully !";
  }
}  else if( checkToDeleteFST) {
    if( remove( cpathToDeleteFST) == 0 ) {
      cout << "\nStudent details cleared successfully ! ";
            }
   }  else if( checkToDeleteSND ) {
       if( remove( cpathToDeleteSND) == 0 ) {
    cout << "\nStudent details cleared successfully !";
       }
         } else {
        cout << "\nIt seems that either the student has already been removed or does not exist.";
     }

我给出了应该从目录中删除的名称。虽然if else块可以工作但是remove函数不起作用。我无法理解原因..

例如,输出如下:

Enter the name to be removed : diana
Press any key to continue . . .

文件diana.txt存在,这就是为什么它没有执行最后一个else块。但是remove function不起作用。 为什么?

4 个答案:

答案 0 :(得分:5)

  

文件diana.txt存在,这就是为什么它没有执行最后一个else块。但删除功能不起作用。那是为什么?

您不知道,因为如果remove成功,您只会打印一条消息。尝试:

if (remove(pathToDeleteFST.c_str()) == 0) {
    // success, print something
} else {
    // failure, much more interesting
    cout << "Can't remove " << pathToDeleteFST << ": "
         << strerror(errno) << endl;
}

errno位于errno.h中,strerror位于string.h

(而不是打开文件来检查它是否存在,你也可以提前充电并尝试remove它。作为@n.m。注意,甚至在Windows上也是必要的。)

答案 1 :(得分:3)

在删除文件之前打开文件。 Windows不会删除某人打开的文件。不要通过打开来检查是否存在文件,使用stat或只是在不检查的情况下调用remove

答案 2 :(得分:1)

您的代码存在一些问题,但可能的原因 remove失败的是文件是打开的; Windows不会删除打开 文件。你应该把很多这个重构成单独的 功能。如果您使用了以下功能,例如:

bool
fileExists( std::string const& filename )
{
    return std::ifstream( filename.c_str() );
}

,问题不会发生。开放还有其他原因 可能会失败,但这是一个很好的粗略的初步近似。 (有 更好的方法来测试文件的存在,但它们是系统 依赖性的。)

答案 3 :(得分:1)

这是一个非常古老的问题,但可能仍然适用于那些寻找解决方案的人。

此特定示例无法正确删除文件的原因是因为要删除的文件当前正由iftream变量中的代码使用。

remove和文件之前,您必须先.close()他们。

如果您在删除之前通过fstream加载的文件时遇到问题,请确保在尝试使用remove功能之前已正确关闭它们。

希望这有帮助。