2011-07-22 32 views
8

Actualmente, estoy tratando con una pequeña aplicación que actualiza los archivos de base de datos compacta de mssql en un servidor iss.Diferencia entre File.Copy y File.Move

He preferido usar SSIS para organizar el flujo. Durante un par de días funcionó bien, pero luego comenzó a dar errores.

En SSIS, he utilizado la operación "Mover archivo" de la "tarea del sistema de archivos" para mover los archivos generados de una carpeta a la carpeta compartida del servidor iss. Si falla, en caso de un archivo bloqueado, lo intenta más tarde. Pero he visto que a veces los archivos en la carpeta de destino comienzan a desaparecer.

Luego he decidido escribir un código personalizado. Eliminé la "Tarea del sistema de archivos" y puse una "Tarea de script" en lugar de ella. Y escribe un par de líneas.

string destinationFile, sourceFile; 
destinationFile = Path.Combine(Dts.Variables["FileRemoteCopyLocation"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString()); 
sourceFile = Path.Combine(Dts.Variables["OrginalFilePath"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString()); 


bool written = false; 


try 
{ 
    File.Copy(sourceFile, destinationFile, true); 
    File.Delete(sourceFile); 
    written = true; 
} 
catch(IOException) { 
    //log it 
} 


if (written) 
    Dts.TaskResult = (int)ScriptResults.Success; 
else 
    Dts.TaskResult = (int)ScriptResults.Failure; 

Funcionó bien. Pero lo intenté bloqueando el archivo de destino. He conectado el archivo de destino en Sql Server Management Studio (es un archivo sdf). Y sorprendentemente también funciona.

Y lo he intentado desde el sistema operativo, al copiar el archivo fuente y pegarlo en el destino. Windows 7 me pregunta si deseo sobreescribirlo y digo que sí y sobrescribió el archivo (copiar y reemplazar) que uso con otro proceso, sin advertencia ningún error. Pero si trato de cambiar el nombre o eliminarlo no me deja hacer eso. O si trato de cortarlo y pegarlo (Mover y Reemplazar) dice "necesitas permiso para hacer esta acción".

Según tengo entendido, "Copiar, eliminar" y "Mover" son cosas totalmente diferentes. Y todavía no puedo entender cómo puedo sobrescribir un archivo bloqueado.

¿Alguna idea?

+0

posible duplicado de [Diferencia entre en hacer copia de archivos/borrar y mover] (http://stackoverflow.com/questions/6621956/difference-between-in-doing-file-copy-delete-and-move) – BrokenGlass

+0

no, no lo es, me pregunto cómo es posible sobrescribir un archivo bloqueado mediante File.Copy. Y los dos bloques de código a continuación no son los mismos: primera 'File.Copy (sourceFile, destinationFile, true); File.Delete (sourceFile);' segundo 'File.Delete (destinationFile); Archivo. Move (sourceFile, destinationFile); ' – fkucuk

Respuesta

5

El método File.Move se puede utilizar para mover el archivo de una ruta a otra. Este método funciona en todos los volúmenes de disco, y no arroja una excepción si el origen y el destino son los mismos.

No puede usar el método Move para sobrescribir un archivo existente. Si intenta reemplazar un archivo moviendo un archivo del mismo nombre en ese directorio, obtendrá una IOException. Para superar esto, puedes usar la combinación de copiar y borrar métodos

respuesta orignal de: Difference between in doing file copy/delete and Move

+0

En realidad, he leído la publicación que mencionaste antes de hacer mi pregunta. La pregunta principal aquí es "¿cómo me permite sobrescribir un archivo bloqueado por File.Copy". Y me di cuenta de que, después de sobrescribir un archivo sdf en el uso, ¡se ha corrompido! Creo que hay más que "no se puede mover un archivo si existe en el destino". – fkucuk