Как узнать, что File.Copy удалось? - PullRequest
16 голосов
/ 29 октября 2011

Статический метод File.Copy(String, String) не возвращает значение.Как я могу программно узнать, была ли эта функция выполнена успешно или нет?Если не сгенерировано исключение, File.Copy идет хорошо.Но я спрашиваю о том, как поставить «без исключения» в качестве условия.

Как-то так:

if(no exception happened){

//my code goes here

}

Редактировать: Я решилпроблема с использованием простого счетчика следующим образом:

int i=0;
try{
    File.Copy();
}
catch(e1){
    i++;
}
catch(e2){
    i++;
}

if(i==0){
    //my code goes here
}

Спасибо всем, кто внес свой вклад.Я пойду через ваши ответы, чтобы выбрать лучший.

Ответы [ 5 ]

22 голосов
/ 29 октября 2011

Если операция не выдает никаких исключений, это означает, что она прошла успешно. Список возможных исключений доступен здесь :

UnauthorizedAccessException

  • Звонящий не имеет необходимого разрешения.

ArgumentException

  • sourceFileName или destFileName - строка нулевой длины, содержит только пробел или содержит один или несколько недопустимых символов, как определено в InvalidPathChars.

  • -или-

  • sourceFileName или destFileName указывает каталог.

ArgumentNullException

  • sourceFileName или destFileName равно нулю.

PathTooLongException

  • Указанный путь, имя файла или оба превышают установленную системой максимальную длину. Например, на платформах Windows пути должны быть не более 248 символов, а имена файлов не должны превышать 260 символов.

DirectoryNotFoundException

  • Путь, указанный в sourceFileName или destFileName, недопустим (например, он находится на неподключенном диске).

FileNotFoundException

  • sourceFileName не найдено.

IOException

  • destFileName существует.

  • -или-

  • Произошла ошибка ввода / вывода.

NotSupportedException

  • sourceFileName или destFileName в недопустимом формате.
11 голосов
/ 29 октября 2011

ошибка

Если метод не генерирует исключение, ошибка не возникает. Метод смог выполнить работу, которую обещал сделать, поэтому он уйдет с дороги и не будет пытаться вернуть какой-либо код состояния. Вам не нужно проверять код состояния, потому что вы будете знать, что он успешно выполнен.

Если метод не выполнит операцию копирования, будет сгенерировано исключение. В этом случае метод не смог выполнить работу, которую он обещал, что означает, что произошло нечто странное (исключительное), поэтому возникает исключение. Поскольку выдается исключение, вы вынуждены иметь дело с ним, или ваша программа взрывается. Так что нет смысла проверять код состояния. Вы не можете написать какой-либо код, который в любом случае мог бы прочитать этот код состояния, так как код проверки состояния никогда не будет достигнут. Поток кода будет идти к блоку catch или завершению программы.

Эти понятия являются основой обработки ошибок с использованием исключений.

Как обрабатывать исключения

Если вам не нужно и у вас есть какой-то разумный способ восстановиться после исключения, не обрабатывайте их. Пусть ваша программа взорвется. Это значительно упростит поиск ошибок в вашем коде, так как необработанное исключение приведет к трассировке стека, которая точно скажет, какая часть вашей программы взорвалась, и как код дошел до этой точки.

Если у вас есть разумный способ восстановления (например, просто отобразить сообщение об ошибке для пользователя и повторить операцию или позволить ему ввести другой параметр), тогда вы можете записать блок try / catch. Напишите код, который может вызвать исключение в блоке try, и код восстановления в блоке catch.

try
{
    var file = File.Open(filename);
    // Todo: Work with open file here
}
catch(FileNotFoundException e)
{
    MessageBox.Show("Failed to open file - " + e.ToString());
    // Todo: Additional recovery here,
    // like telling the calling code to re-open the file selection dialog
}

Обратите внимание, что вы никогда не должны перехватывать базовый тип Exception, а вместо этого должны перехватывать определенные производные типы исключений, которые вы можете обработать (например, FileNotFoundException). Это имеет смысл, потому что вы, вероятно, не можете написать код, который успешно восстановится после OutOfMemoryException, и это исключение может возникнуть в любой точке вашего кода. Если вы перехватываете Exception, то вы пишете код, который пытается обработать что угодно , а не только интересующие вас исключения.

Завершение

File.Copy - синхронная операция. Поэтому, как только метод завершен, фактическое копирование завершено.

Это означает, что вы можете написать строку кода сразу после строки копирования. И этот код может ожидать, что файл будет там, чтобы он был полностью скопирован и чтобы он был доступен.

5 голосов
/ 29 октября 2011

Если метод не генерирует исключение, это означает, что он успешно выполнен.

2 голосов
/ 29 октября 2011

если нет исключения, это означает, что файл успешно скопирован ...

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = path + "temp";

        try 
        {
            // Create the file and clean up handles.
            using (FileStream fs = File.Create(path)) {}

            // Ensure that the target does not exist.
            File.Delete(path2);

            // Copy the file.
            File.Copy(path, path2);
            Console.WriteLine("{0} copied to {1}", path, path2);

            // Try to copy the same file again, which should succeed.
            File.Copy(path, path2, true);
            Console.WriteLine("The second Copy operation succeeded, which was expected.");
        } 

        catch 
        {
            Console.WriteLine("Double copy is not allowed, which was not expected.");
        }
    }
}
1 голос
/ 29 октября 2011

Хотя я не знаю, в какой ситуации вы находитесь, но у меня есть нечто похожее, когда мне приходится копировать файлы, и мне нужно было знать, удалось ли это, так как я не смог найти ничего полезного в .NET API, моя единственная возможность была продолжайте пытаться, пока это не удастся (попробуйте это число раз), например, в следующем коде я должен отказаться после 5 попыток

private bool CopyDone()
{
  bool done = false;
  int i = 0;
  string source = "SourceFile";
  while (i < 5)
  {
    try
    {

      System.IO.File.Copy(source, target, true);
      i = 5;
      done = true;
    }
    catch (Exception exp)
    {
      Trace.WriteLine("File trouble " + exp.Message);
      System.Threading.Thread.Sleep(1000);
      i++;
    }

   }

  /* if(!done)
   {
      Trace.WriteLine("Failed to copy file "+source );
   }*/
  return done;

}
...