2012-10-12 100 views
0

我正在使用VS2010上的C#編寫文件更新/解鎖應用程序。 我想要的是使用我的應用程序使用密碼鎖定文件,然後隨時解鎖它。永久鎖定文件

實際上,我使用了下面的代碼來鎖定文件,但只在應用程序仍在運行時鎖定文件;當我關閉應用程序時,文件被解鎖。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using System.Configuration; 
using System.Windows.Forms; 

namespace LockFile 
{ 
    public enum LockStatus 
    { 
     Unlocked, 
     Locked 
    } 

    public class LockFilePresenter 
    { 
     private ILockFileView view; 
     private string file2Lock = string.Empty; 
     private FileStream fileLockStream = null; 

     public LockFilePresenter(ILockFileView view) 
     { 
      this.view = view; 
     } 

     internal void LockFile() 
     { 
      if (string.IsNullOrEmpty(file2Lock) || !File.Exists(file2Lock)) 
      { 
       view.ShowMessage("Please select a path to lock."); 
       return; 
      } 

      if (fileLockStream != null) 
      { 
       view.ShowMessage("The path is already locked."); 
       return; 
      } 
      try 
      { 
       fileLockStream = File.Open(file2Lock, FileMode.Open); 
       fileLockStream.Lock(0, fileLockStream.Length); 
       view.SetStatus(LockStatus.Locked); 
      } 
      catch (Exception ex) 
      { 
       fileLockStream = null; 
       view.SetStatus(LockStatus.Unlocked); 
       view.ShowMessage(string.Format("An error occurred locking the path.\r\n\r\n{0}", ex.Message)); 
      } 
     } 

     internal void UnlockFile() 
     { 
      if (fileLockStream == null) 
      { 
       view.ShowMessage("No path is currently locked."); 
       return; 
      } 
      try 
      { 
       using (fileLockStream) 
        fileLockStream.Unlock(0, fileLockStream.Length); 
      } 
      catch (Exception ex) 
      { 
       view.ShowMessage(string.Format("An error occurred unlocking the path.\r\n\r\n{0}", ex.Message)); 
      } 
      finally 
      { 
       fileLockStream = null; 
      } 
      view.SetStatus(LockStatus.Unlocked); 
     } 

     internal void SetFile(string path) 
     { 
      if (ValidateFile(path)) 
      { 
       if (fileLockStream != null) 
        UnlockFile(); 
       view.SetStatus(LockStatus.Unlocked); 
       file2Lock = path; 
       view.SetFile(path); 
      } 
     } 

     internal bool ValidateFile(string path) 
     { 
      bool exists = File.Exists(path); 
      if (!exists) 
       view.ShowMessage("File does not exist."); 
      return exists; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace LockFile 
{ 
    public interface ILockFileView 
    { 
     void ShowMessage(string p); 
     void SetStatus(LockStatus lockStatus); 
     void SetFile(string path); 
    } 
} 

正如我以前說過,應用程序在運行時工作正常,但是當我關閉它,鎖定的文件將被解鎖。

如果任何人有任何想法如何做到這一點,我將不勝感激。

+3

'鎖定'這裏是特定於線程,所以當你關閉應用程序(並殺死線程)時,其他程序可以訪問該文件。我想你可能想研究密碼保護/加密。 – Laurence

+2

不知何故,我認爲你濫用鎖定系統是不應該做的事情;它不是關於訪問權限,而是關於確保應用程序不會無效輸入或弄亂文件。 –

+0

@owlstead所以你建議做什麼? .. 有什麼建議嗎? 謝謝 – Hassanation

回答

4

FileStream一個Lock只是意味着你的過程必須同時是活躍的文件的獨佔訪問;它與密碼保護文件無關。

這聽起來像你想要的是用密碼加密文件。文件類基於當前用戶提供加密/解密,或者,如果您希望基於您自己的自定義密碼,則可以使用System.Security.Cryptography命名空間中的某些類的示例在此處使用密碼加密文件(而不是硬編碼你會認爲它作爲輸入)http://www.codeproject.com/Articles/26085/File-Encryption-and-Decryption-in-C

請記住,做安全權是

0

如果您只需要確保在應用程序鎖定時沒有其他人可以讀取或修改該文件,則下面的內容應該可以完成這項工作。

如果您還需要更多內容,請查看適當的文件加密技術。

請注意,如果關閉該應用程序,鎖定將不再有效。

System.IO.FileStream fileStream; 

    private void LockFile(string FilePath) 
    { 
     fileStream = System.IO.File.Open(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None); 
     //using System.IO.FileShare.None in the above line should be sufficient, but just to go the extra mile... 
     fileStream.Lock(0, fileStream.Length); 
    } 

    private void UnlockFile() 
    { 
     if (fileStream != null) 
     { 
      try { fileStream.Unlock(0, fileStream.Length); } 
      finally { fileStream.Dispose(); } 
     } 
    } 
2

您正在使用FileStream.Lock()方法鎖定特定文件,以便只有運行FileStream的進程才能使用它。

http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx

這是旨在防止其他進程寫入您的讀/寫文件的機制,你可以看到在使用此方法如Microsoft Excel應用程序。

當您關閉應用程序時,進程不再運行,並且文件上的鎖定被解除鎖定。

如果你的目標是防止其他應用程序讀取該文件,你有一些有限的選擇:

  1. 加密的文件。這意味着如果沒有解密密鑰,應用程序無法從文件中讀取可用信息,但是應用程序可能會打開並更改加密文件。
  2. 將文件保存到只讀介質(如CD/DVD),或存儲到可移動存儲設備中,然後拔下並隨身攜帶。

如果你想防止其他應用程序修改該文件,你可能看的Windows提供了只讀標誌:http://msdn.microsoft.com/en-us/library/system.io.fileinfo.isreadonly.aspx

注意的是,這些仍是不安全的,因爲只讀標誌可以忽略不計。

你需要考慮的是你爲什麼要限制對文件的訪問的推理 - 這將有助於確定限制訪問的最佳策略。