c# - ¿Cómo saber que File.Copy tuvo éxito?
.net exception (5)
El método estático File.Copy(String, String)
no devuelve un valor. ¿Cómo puedo saber programáticamente si esa función tuvo éxito o no? Si no hay una excepción lanzada, File.Copy
va bien. Pero estoy preguntando acerca de cómo poner "no excepción" como condición.
Algo como esto:
if(no exception happened){
//my code goes here
}
Edit: He resuelto el problema usando un contador simple como sigue:
int i=0;
try{
File.Copy();
}
catch(e1){
i++;
}
catch(e2){
i++;
}
if(i==0){
//my code goes here
}
Gracias por todos los colaboradores. Voy a ir a través de sus respuestas para elegir el mejor.
Aunque no sé en qué situación te encuentras, pero tengo una situación similar en la que tengo que copiar archivos y necesito saber si tuvo éxito. Como no pude encontrar nada útil en la API .NET, mi única opción era seguir intentando hasta tiene éxito (inténtelo no. veces), por ejemplo, en el siguiente código, debo abandonar después de 5 intentos
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;
}
Si el método no lanza una excepción, significa que ha tenido éxito.
Si la operación no lanza ninguna excepción, significa que fue exitosa. La lista de las posibles excepciones está disponible here :
- La persona que llama no tiene el permiso necesario.
sourceFileName
odestFileName
es una cadena de longitud cero, solo contiene espacios en blanco o contiene uno o más caracteres no válidos, tal como lo defineInvalidPathChars
.-o-
sourceFileName
odestFileName
especifica un directorio.
- sourceFileName o destFileName es nulo.
- La ruta especificada, el nombre del archivo o ambos exceden la longitud máxima definida por el sistema. Por ejemplo, en las plataformas basadas en Windows, las rutas deben tener menos de 248 caracteres y los nombres de los archivos deben tener menos de 260 caracteres.
- La ruta especificada en sourceFileName o destFileName no es válida (por ejemplo, está en una unidad sin asignar).
- No se encontró
sourceFileName
.
destFileName
existe.-o-
Se ha producido un error de E / S.
sourceFileName
odestFileName
está en un formato no válido.
si no hay una excepción, significa que el archivo se copió correctamente ...
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.");
}
}
}
Los errores
Si el método no produce una excepción, no se produjo ningún error. El método fue capaz de realizar el trabajo que prometió que haría, por lo que se saldrá del camino y no intentará devolver algún tipo de código de estado. No necesitará verificar un código de estado porque sabrá que ha tenido éxito.
Si el método falla la operación de copia, se lanzará una excepción. En este caso, el método no pudo realizar el trabajo que prometió que haría, lo que significa que sucedió algo extraño (excepcional), por lo que se lanza una excepción. Dado que se lanza una excepción, se le obliga a lidiar con ella o su programa explota. Por lo tanto, no tiene sentido verificar un código de estado. No se podría escribir ningún código que pudiera leer ese código de estado de cualquier manera, ya que nunca se alcanzaría el código de verificación de estado. El flujo de código iría al bloque catch
o a la terminación del programa.
Estos conceptos son la base del manejo de errores utilizando excepciones.
Cómo manejar las excepciones.
A menos que lo necesite, y tenga alguna forma razonable de recuperarse de la excepción, no los maneje. Deja que tu programa explote. Esto hará que sea mucho más fácil encontrar errores en su código, ya que una excepción no manejada producirá un seguimiento de la pila, que le dirá exactamente qué parte de su programa explotó y cómo llegó el código a ese punto.
Si tiene una forma razonable de recuperar (por ejemplo, simplemente mostrar un mensaje de error al usuario y volver a intentar la operación, o dejar que ingrese un parámetro diferente), puede escribir un bloque try
/ catch
. Escriba su código que podría generar una excepción en el bloque try
y escriba su código de recuperación en el bloque 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
}
Tenga en cuenta que nunca debe capturar el tipo de Exception
base, y en su lugar debe capturar los tipos de excepción derivados específicos que puede manejar (por ejemplo, la FileNotFoundException
) Esto tiene sentido porque probablemente no pueda escribir el código que se recuperará con éxito de una OutOfMemoryException
, y esa excepción podría lanzarse en cualquier punto de su código. Si detecta la Exception
, está escribiendo un código que intenta manejar cualquier cosa , no solo las excepciones en las que está interesado.
Terminación
File.Copy
es una operación síncrona. Así que una vez que el método se ha completado, entonces la copia real se ha completado.
Esto significa que puede escribir una línea de código inmediatamente después de la línea de copia. Y ese código puede esperar que el archivo esté allí, para que se copie completamente y para que sea accesible.