Para verificar si algún archivo está en uso (abierto) use File Stream
.
Por ejemplo:
Suponga que tiene una ruta de archivo almacenado en txtAttachPath.Text
y que desea abrir ese archivo si no está ya abierto, es necesario comprobar si el archivo está abierto primero y luego abrirlo, esto es cómo hacerlo:
crear un método para comprobar si el archivo está abierto:
private bool attachedFileIsOpen(FileInfo file)
{
FileStream fs = null;
try
{
fs = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException ioe)
{
MessageBox.Show("The attachment file is already open!, can't open more than once!", "AMP Warning", MessageBoxButtons.OK, MessageBoxIcon.Information);
return true;
}
finally
{
if (fs != null) fs.Close();
}
return false;
}
el método comprobará si el archivo es abierto y Retrun cierto con un mensaje al usuario que el archivo es aleardy abierta, de lo contrario, devolverá falso (el archivo es no esta en uso).
Siguiente usando el método provocada por cualquier evento que elija:
FileInfo filePath = new FileInfo(txtAttachPath.Text);
if (!txtAttachPath.Text.Equals("No Attachment")
&& attachedFileIsOpen(filePath) == false
&& processIsRunning("notepad") == false)
{
Process openFilebyExtension = Process.Start(txtAttachPath.Text);
openFilebyExtension.WaitForInputIdle();
NativeWindow.FromHandle(this.Handle);
}
Nota algunos incorporado en los programas de Windows como la libreta permite que varias instancias del mismo archivo que se abran, por tanto, no pueden ser detectados por el método File Stream
, la otra solución para él es detectar si el proceso se está ejecutando.
tendrá que añadir otro método para comprobar si hay proceso asociado al tipo de archivo que está intentando abrir ejecutando:
private bool processIsRunning(string process)
{
Process[] runningProcesses = Process.GetProcessesByName(process);
bool processIsRunning = false;
if(runningProcesses.Length == 0)
{
processIsRunning = false;
}
else
{
processIsRunning = true;
MessageBox.Show("The attachment file is already open!, can't open more than once!", "AMP Warning",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
return processIsRunning;
}
cualquier solución final con el código fuente completo? – Kiquenet