C# 永久锁定文件
我正在使用VS2010上的C#开发一个文件锁定/解锁应用程序。 我想要的是使用我的应用程序用密码锁定一个文件,然后随时解锁它 事实上,我使用了下面的代码来锁定文件,但是只有当应用程序仍在运行时,文件才会被锁定;当我关闭应用程序时,文件被解锁C# 永久锁定文件,c#,encryption,filestream,file-locking,C#,Encryption,Filestream,File Locking,我正在使用VS2010上的C#开发一个文件锁定/解锁应用程序。 我想要的是使用我的应用程序用密码锁定一个文件,然后随时解锁它 事实上,我使用了下面的代码来锁定文件,但是只有当应用程序仍在运行时,文件才会被锁定;当我关闭应用程序时,文件被解锁 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Configuration; using System.Wind
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;
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;
}
}
}
如果有人知道怎么做,我将不胜感激。如果您需要做的只是确保在应用程序锁定文件的同时,其他任何东西都不能读取或修改该文件,那么下面的程序应该可以完成这项工作 如果您还需要什么,请研究适当的文件加密技术 请注意,如果关闭应用程序,锁将不再有效
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(); }
}
}
如果您需要做的只是确保在应用程序锁定该文件时,其他任何东西都不能读取或修改该文件,那么下面的内容应该可以完成这项工作 如果您还需要什么,请研究适当的文件加密技术 请注意,如果关闭应用程序,锁将不再有效
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(); }
}
}
FileStream上的锁
只意味着进程在文件处于活动状态时以独占方式访问该文件;它与保护文件的密码无关
听起来你想要的是用密码加密一个文件。file类提供基于当前用户的加密/解密,或者,如果您希望基于您自己的自定义密码进行加密/解密,则可以使用System.Security.Cryptography
命名空间中的一些类在此处使用密码加密文件(而不是硬编码,您可能会将其作为输入)
请记住,使用安全权限很难。对FileStream
进行锁定只意味着您的进程在文件处于活动状态时对其具有独占访问权;它与保护文件的密码无关
听起来你想要的是用密码加密一个文件。file类提供基于当前用户的加密/解密,或者,如果您希望基于您自己的自定义密码进行加密/解密,则可以使用System.Security.Cryptography
命名空间中的一些类在此处使用密码加密文件(而不是硬编码,您可能会将其作为输入)
请记住,正确使用安全性是很困难的。您正在使用FileStream.Lock()
方法锁定特定文件,以便只有运行FileStream
的进程才能使用它
这是一种机制,旨在防止其他进程写入您正在读取/写入的文件,您可以看到此方法在Microsoft Excel等应用程序中使用
当您关闭应用程序时,进程将不再运行,并且文件上的锁将被解除
如果您的目标是阻止其他应用程序读取该文件,则您有一些有限的选项:
加密文件。这意味着如果没有解密密钥,应用程序无法从文件中读取可用信息,但应用程序可能会打开并更改加密文件
将文件保存到只读介质(如CD/DVD)或可移动存储器中,然后拔下插头随身携带
如果要防止其他应用程序修改该文件,可以查看Windows提供的只读标志:
请注意,这些仍然是不安全的,因为只读标志可以忽略
您需要考虑的是您为什么要限制对文件的访问,这将有助于确定限制访问的最佳策略。您正在使用FileStream.Lock()
方法锁定特定文件,以便只有运行FileStream
的进程才能使用它
这是一种机制,旨在防止其他进程写入您正在读取/写入的文件,您可以看到此方法在Microsoft Excel等应用程序中使用
当您关闭应用程序时,进程将不再运行,并且文件上的锁将被解除
如果您的目标是阻止其他应用程序读取该文件,则您有一些有限的选项:
加密文件。这意味着如果没有解密密钥,应用程序无法从文件中读取可用信息,但应用程序可能会打开并更改加密文件
将文件保存到只读介质(如CD/DVD)或可移动存储器中,然后拔下插头随身携带
如果要防止其他应用程序修改该文件,可以查看Windows提供的只读标志:
请注意,这些仍然是不安全的,因为只读标志可以忽略
您需要考虑的是您为什么要限制对文件的访问的原因-这将有助于确定限制访问的最佳策略。锁定
这里是特定于线程的,因此当您关闭应用程序(并终止线程)时,其他程序可以访问该文件。我想你可能想研究密码保护/加密。不知何故,我确实认为你滥用了锁定系统,因为它不应该这样做;这不是关于访问权限,而是关于确保应用程序不会得到无效的输入,或弄乱文件。@owlstead那么你建议怎么做。。有什么建议吗?感谢除了加密文件之外,实现这一点的唯一方法是让应用程序保持活动状态。您可以通过在后台运行应用程序的实例来实现这一点,例如作为服务运行,但我不推荐这样做。Hassan,您已经接受了我选择的答案。有时候你不需要加密