2013-08-30 4 views
1
#include <iostream> 
#include <string.h> 
#include <fstream> 
#include <conio.h> 


int main() 
{ 
    int k=0; 
    char *source = new char[30]; 
    char *destination = new char[30]; 
    while(k==0) 
{ 
    cout<<"Enter the source File location: "; 
    cin>>source; 
    cout<<endl<<"Enter the destination File location: "; 
    cin>>destination; 
    ifstream is(source,ios::in | ios::binary); 
    ofstream os(destination,ios::out | ios::binary); 

    if(is==NULL || os==NULL) 
    { 
     perror("Either the input or the ouput location is invalid"); 
     cout<<endl<<"Try again with new location.\n"; 
     cout<<endl<<"To exit press 7 and to continue press 0"; 
     cin>>k; 

    } 
    else 
    { 

        os<<is.rdbuf(); 
     k++; 
     cout<<endl<<"File moved successfully"; 
     cout<<endl<<"Do you want to delete the original file: [y/n]"; 
     if(getch()=='y') 
     { 
      if(remove(source)== -1) 
      perror("Error in deleting File"); 
      else 
      cout<<" Source File deleted."; 
     } 

    } 
} 
} 

Файл успешно удален, но при удалении файла он говорит:Ошибка при удалении файла в C++

«Ошибка при удалении файлов» Отказано.

Я использовал оба вида косой черты (вперед и назад), когда он просит источника и адрес назначения (например, C: /MIT/adi.txt) и я компиляции с помощью MinGW компилятор ... Это ошибка ОС или есть ли какие-либо проблемы с моим кодом или компилятором?

+0

Хорошо, действительно ли у программы есть разрешение? И достаточно ли 30 символов для целого пути? – Potatoswatter

+1

Где вы ** закрываете входной поток **? –

+0

Вы действительно не должны сравнивать поток с 'NULL'. Просто проверьте свой статус напрямую: 'if (! Is ||! Os)'. (Хотя я бы проверял каждый отдельно, чтобы генерировать лучшее сообщение об ошибке.) –

ответ

3

Две вещи выскочить на меня:

  • 30 символов не достаточно для большинства полных путей. Также вы не должны использовать new, если можете этого избежать; массивы с фиксированной длиной также могут идти в стек; и это работа для std::string, если она когда-либо была.

  • Перед попыткой удалить его вы не закрыли файл. Платформы отличаются от этого требования, но я думаю, что Windows это не нравится. Уничтожьте или закройте поток перед вызовом remove.

+0

Вы хотите явно закрыть файл в любом случае, так как вы почти наверняка захотите проверить, что копия работала до удаления источника. (Говоря, что «Файл перемещен успешно», когда он не был, вы не выиграете у вас друзей в сообществе пользователей.) –

Смежные вопросы