none
Abrir um arquivo e verificar se tem outro aberto c# RRS feed

  • Pergunta

  • Tem uma dúvida aqui eu queria abrir um arquivo mas queria que ele verificasse se um outro arquivo externo está aberto caso contrário ele feche eu ainda não achei nada sobre isso aí você poderia estar me ajudando hum esse tipo de formulário e quando eu executar ele ele vai verificar se um determinado arquivo está aberto se tiver ele vai abrir caso contrário ele irá fechar.

    Um dos aplicativos Ele tá em um vb e o outro em c# gostaria de colocar o comando quando ele for abrir o principal ele permita que o outro arquivo abra em outro caso se ele tentar abrir o segundo arquivo mas o primeiro não estiver aberto ele irá verificar se esta aberto se não tiver aberto ele irá fechar era isso que eu queria saber se tem como e como eu faço

    sábado, 10 de outubro de 2020 16:06

Respostas

  • Olá,

    Você pode usar o exemplo de código para implementar uma método para checar se tem um arquivo sendo usado.


    using System.IO;
    using System.Runtime.InteropServices;
    internal static class Helper
    {
    const int ERROR_SHARING_VIOLATION = 32;
    const int ERROR_LOCK_VIOLATION = 33;

    private static bool IsFileLocked(Exception exception)
    {
        int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
        return errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
    }

    internal static bool CanReadFile(string filePath)
    {
        //Try-Catch so we dont crash the program and can check the exception
        try {
            //The "using" is important because FileStream implements IDisposable and
            //"using" will avoid a heap exhaustion situation when too many handles  
            //are left undisposed.
            using (FileStream fileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) {
                if (fileStream != null) fileStream.Close();  //This line is me being overly cautious, fileStream will never be null unless an exception occurs... and I know the "using" does it but its helpful to be explicit - especially when we encounter errors - at least for me anyway!
            }
        }
        catch (IOException ex) {
            //THE FUNKY MAGIC - TO SEE IF THIS FILE REALLY IS LOCKED!!!
            if (IsFileLocked(ex)) {
                // do something, eg File.Copy or present the user with a MsgBox - I do not recommend Killing the process that is locking the file
                return false;
            }
        }
        finally
        { }
        return true;
    }

    segunda-feira, 12 de outubro de 2020 14:00
    Moderador

Todas as Respostas

  • Se você tentar abrir um arquivo que está aberto em outro processo, uma exceção será lançada. Desse jeito  você descobre.
    sábado, 10 de outubro de 2020 23:09
    Moderador
  • Olá,

    Você pode usar o exemplo de código para implementar uma método para checar se tem um arquivo sendo usado.


    using System.IO;
    using System.Runtime.InteropServices;
    internal static class Helper
    {
    const int ERROR_SHARING_VIOLATION = 32;
    const int ERROR_LOCK_VIOLATION = 33;

    private static bool IsFileLocked(Exception exception)
    {
        int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
        return errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
    }

    internal static bool CanReadFile(string filePath)
    {
        //Try-Catch so we dont crash the program and can check the exception
        try {
            //The "using" is important because FileStream implements IDisposable and
            //"using" will avoid a heap exhaustion situation when too many handles  
            //are left undisposed.
            using (FileStream fileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) {
                if (fileStream != null) fileStream.Close();  //This line is me being overly cautious, fileStream will never be null unless an exception occurs... and I know the "using" does it but its helpful to be explicit - especially when we encounter errors - at least for me anyway!
            }
        }
        catch (IOException ex) {
            //THE FUNKY MAGIC - TO SEE IF THIS FILE REALLY IS LOCKED!!!
            if (IsFileLocked(ex)) {
                // do something, eg File.Copy or present the user with a MsgBox - I do not recommend Killing the process that is locking the file
                return false;
            }
        }
        finally
        { }
        return true;
    }

    segunda-feira, 12 de outubro de 2020 14:00
    Moderador