2016-08-05 1 views
0

ファイルを作業フォルダからバックアップフォルダに移動するサービスがあります。フォルダはネットワーク共有上にあるので、メモ帳のようなものを使ってファイルを開いてみることがあります。人々は、編集しているだけではなく、見ているだけではありません。ファイルロックを解除する方法

ファイルを移動しようとすると、私は許可が拒否されます。私はC#でファイルロックを強制的に削除する方法を探しているので、サービスはファイルをバックアップフォルダに移動できます。

+1

これはWindowsでですか?重要なファイルがある場合は、他のユーザーのために読み取り専用にしてください。そうしないと、プロセスによってロックされる可能性があります。 – muratgu

+0

移動しないで**コピーする**のように聞こえますか? moveは、コピー後にソースフォルダからファイルを削除します。 – Slai

答えて

1

P/Invokeを使用する必要があります。これらは、あなたが気に機能している:

[DllImport("netapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
static extern int NetFileEnum(string servername, string basepath, string username, int level, ref IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries, IntPtr resume_handle); 

[DllImport("netapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
static extern int NetFileClose(string servername, int id); 

[DllImport("Netapi32.dll", SetLastError = true)] 
static extern int NetApiBufferFree(IntPtr buffer); 

ここで私は成功を収めて使用されてきたものに似たいくつかのコードです:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
struct FILE_INFO_3 
{ 
    public int fi3_id; 
    public int fi3_permission; 
    public int fi3_num_locks; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string fi3_pathname; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string fi3_username; 
} 

private static FILE_INFO_3[] GetLockedFiles(string server, string path) 
{ 
    const int MAX_PREFERRED_LENGTH = -1; 

    int dwReadEntries; 
    int dwTotalEntries; 
    IntPtr pBuffer = IntPtr.Zero; 
    FILE_INFO_3 pCurrent = new FILE_INFO_3(); 
    List<FILE_INFO_3> files = new List<FILE_INFO_3>(); 

    int dwStatus = NetFileEnum(server, path, null, 3, ref pBuffer, MAX_PREFERRED_LENGTH, out dwReadEntries, out dwTotalEntries, IntPtr.Zero); 
    if (dwStatus == 0) 
    { 
     for (int dwIndex = 0; dwIndex < dwReadEntries; dwIndex++) 
     { 
      IntPtr iPtr = new IntPtr(pBuffer.ToInt32() + (dwIndex * Marshal.SizeOf(pCurrent))); 
      pCurrent = (FILE_INFO_3)Marshal.PtrToStructure(iPtr, typeof(FILE_INFO_3)); 
      files.Add(pCurrent); 
     } 
    } 

    NetApiBufferFree(pBuffer); 

    return files.ToArray(); 
} 

static void Main(string[] args) 
{ 
    FILE_INFO_3[] lockedFiles = GetLockedFiles("someservername", @"C:\somepath"); 

    foreach (FILE_INFO_3 lockedFile in lockedFiles) 
    { 
     int dwStatus = NetFileClose(_serverName, lockedFile.fi3_id); 
     // Check dwStatus for success here 
    } 
} 

EDIT:下のコメントでOPが指摘したように、 64ビットとしてコンパイルする場合、ToInt32ではなくToInt64を使用する必要があります。詳細はhereを参照してください。

+0

クール、私は彼らにショットを与えました。 – BCarlson

+0

誰かがdownvoteを説明しますか? – itsme86

+0

私は投票しませんでしたが、これはいくつかのファイルが壊れているか不完全なままになることがありますか?ファイルを閉じずにコピーする方が安全かもしれません。 – Slai

関連する問題