我正在使用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);
}
}
正如我之前所说,应用程序在运行时工作正常,但当我关闭它时,锁定的文件将被解锁。
如果有人知道怎么做,我将不胜感激。
答案 0 :(得分:4)
Lock
上的FileStream
只表示您的进程在文件处于活动状态时具有对该文件的独占访问权限;它与密码保护文件无关。
听起来你想要的是用密码加密文件。文件类根据当前用户提供Encrypt / Decrypt,或者,如果您希望它基于您自己的自定义密码,则可以使用System.Security.Cryptography
命名空间中的某些类来加密带有密码的文件(而不是硬编码,你可能会把它作为输入)http://www.codeproject.com/Articles/26085/File-Encryption-and-Decryption-in-C
请记住,做正确的安全是很难。
答案 1 :(得分:2)
您正在使用FileStream.Lock()
方法锁定特定文件,以便只有运行FileStream
的进程才能使用它。
http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx
这是一种旨在防止其他进程写入您正在读取/写入的文件的机制,您可以看到此方法与Microsoft Excel等应用程序一起使用。
当您关闭应用程序时,该进程将不再运行,并且文件上的锁定将被解除。
如果您的目标是阻止其他应用程序读取文件,那么您有一些有限的选择:
如果您想阻止其他应用程序修改文件,您可能会查看Windows提供的ReadOnly标志:http://msdn.microsoft.com/en-us/library/system.io.fileinfo.isreadonly.aspx
请注意,这些仍然是不安全的,因为可以忽略只读标志。
您需要考虑的是您想要限制访问文件的原因 - 这将有助于确定限制访问的最佳策略。
答案 2 :(得分: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(); }
}
}