Подтвердить что ты не робот

Как узнать, что File.Copy удалось?

Статический метод 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
}

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

4b9b3361

Ответ 1

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

UnauthorizedAccessException

  • У вызывающего абонента нет требуемого разрешения.

ArgumentException

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

  • -или -

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

ArgumentNullException

  • sourceFileName или destFileName имеет значение null.

PathTooLongException

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

DirectoryNotFoundException

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

FileNotFoundException

  • sourceFileName не найден.

IOException

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

  • -или -

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

NotSupportedException

  • sourceFileName или destFileName находится в недопустимом формате.

Ответ 2

Ошибки

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

Если метод завершит операцию копирования, будет выбрано исключение. В этом случае метод не смог выполнить работу, которую он обещал сделать, что означает что-то странное (исключительное), так что возникает исключение. Поскольку выбрано исключение, вы вынуждены заниматься этим, или ваша программа взрывается. Поэтому нет смысла проверять код состояния. Вы не могли бы написать код, который мог бы прочитать этот код состояния в любом случае, так как код проверки состояния никогда не будет достигнут. Поток кода переместился бы в блок 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 является синхронной операцией. Итак, как только метод завершится, завершена фактическая копия.

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

Ответ 3

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

Ответ 4

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

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.");
        }
    }
}

Ответ 5

Хотя я не знаю, в какой ситуации вы участвуете, но у меня есть что-то подобное, когда мне приходится копировать файлы и нужно знать, удалось ли это, так как я не мог найти ничего полезного в .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;

}