Domanda

Esiste alcun modo in Net per controllare prima di aprire se un file (su un'unità di rete locale) è già in uso?

È stato utile?

Soluzione

Si dovrebbe cercare di accedervi e se non è riuscito, è o non si dispone di autorizzazioni necessarie (che si può verificare con GetAccessControl) o è bloccato da un altro processo.

Ma io non credo che ci sia alcuna misura affidabile per distinguere una serratura e un fallimento l'autorizzazione (poiché potrebbe essere in grado di leggere il file, ma non in grado di controllare le autorizzazioni). Anche il messaggio di errore di Windows' dice che sia non hai il permesso o è in uso da un altro processo.

È possibile utilizzare WMI classe CIM_DataFile per interrogare InUseCount per un file di dati specificato.

Se siete alla ricerca di un equivalente programmatico per lsof utilità in Linux, per scoprire tutti i file aperti da un determinato locali processo, si potrebbe provare a utilizzare Win32_Process classe WMI attraverso System.Management namespace. Si potrebbe emettere una query WMI per cercare il nome del file in tutti i file aperti utilizzati da tutti i processi locali troppo vedere se c'è o no. In alternativa, si potrebbe P / Invoke e l'uso NtQuerySystemInformation API direttamente a eseguire la stessa operazione.

Altri suggerimenti

Questo farà. FileShare.NONE come accennato in MSDN:

  

Nessuno: I declini la condivisione del file corrente. Qualsiasi richiesta di aprire il file (da questo processo o di un altro processo) non riuscirà fino a quando il file viene chiuso.

File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);

EDIT: Ricordarsi di avvolgere in un blocco try / catch, e utilizzando FileShare.NONE significa in realtà che si desidera aprire esclusivamente il file

.
bool CanReadAndWrite(string path)
{
    var perm = new System.Security.Permissions.FileIOPermission(
         System.Security.Permissions.FileIOPermissionAccess.Write |
         System.Security.Permissions.FileIOPermissionAccess.Read,
         path);
    try
    {
         perm.Demand();
         return true;
    }
    catch 
    {
         return false;
    }
}

Controlla se è possibile leggere e scrivere in un file.

Usa System.IO.File.OpenWrite (percorso). Circondarla in un blocco try / catch, e se è già aperto per la scrittura da qualche altra parte, si otterrà uno System.UnauthorizedAccessException.

La sintassi seguente vi aiuterà:

FileStream s2 = new FileStream (nome, FileMode.Open, FileAccess.Read, FileShare.Read);

In generale, si dovrebbe sempre evitare di fare affidamento sui controlli di file di accessibilità. La ragione è che potrebbe essere, e allora può cambiare solo un paio di cicli prima di accedervi.

Al contrario, solo cercare di aprirlo e vedere se si dispone di eventuali errori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top