【问题标题】:Permanently locking a file永久锁定文件
【发布时间】:2012-10-12 23:36:37
【问题描述】:

我正在 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);
    }
}

正如我之前所说,应用程序在运行期间工作正常,但是当我关闭它时,锁定的文件将被解锁。

如果有人知道如何做,我将不胜感激。

【问题讨论】:

  • Locking 这里是特定于线程的,因此当您关闭应用程序(并终止线程)时,其他程序可以访问该文件。我想你可能想研究密码保护/加密。
  • 不知何故,我确实认为您正在滥用锁定系统做一些不应该做的事情;这与访问权限无关,而是确保应用程序不会获得无效输入或弄乱文件。
  • @owlstead 那么你有什么建议呢? ..有什么建议吗?谢谢
  • 除了加密文件之外,实现此目的的唯一方法是让应用程序保持活动状态。您可以通过在后台运行应用程序实例来实现这一点,例如作为服务,但我不建议这样做。
  • 哈桑,你已经接受了我会选择的答案。有时你不需要加密,最终它是关于访问看起来的文件,在这种情况下,访问权限也会浮现在脑海中。

标签: c# encryption filestream file-locking


【解决方案1】:

Lock 上的 FileStream 仅表示您的进程在文件处于活动状态时拥有对文件的独占访问权限;它与密码保护文件无关。

听起来你想要的是用密码加密文件。文件类提供基于当前用户的加密/解密,或者,如果您希望它基于您自己的自定义密码,这里有一个示例,使用 System.Security.Cryptography 命名空间中的一些类来加密带有密码的文件(而不是硬编码,你大概会把它作为输入)http://www.codeproject.com/Articles/26085/File-Encryption-and-Decryption-in-C

请记住,确保安全权很难

【讨论】:

    【解决方案2】:

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

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

    这是一种机制,旨在防止其他进程写入您正在读取/写入的文件,您可以在 Microsoft Excel 等应用程序中看到此方法。

    当您关闭应用程序时,该进程不再运行,并且文件上的锁定被解除。

    如果您的目标是阻止其他应用程序读取该文件,您有一些有限的选择:

    1. 加密文件。这意味着应用程序无法在没有解密密钥的情况下从文件中读取可用信息,但应用程序有可能打开和更改加密文件。
    2. 将文件保存到只读媒体(如 CD/DVD)或可移动存储设备中,然后拔下插头并随身携带。

    如果您想阻止其他应用程序修改文件,您可以查看 Windows 提供的 ReadOnly 标志:http://msdn.microsoft.com/en-us/library/system.io.fileinfo.isreadonly.aspx

    请注意,这些仍然是不安全的,因为可以忽略只读标志。

    您需要考虑的是您为什么要限制对文件的访问的原因 - 这将有助于确定限制访问的最佳策略。

    【讨论】:

      【解决方案3】:

      如果您需要做的就是确保在您的应用程序锁定文件时没有其他人可以读取或修改文件,那么下面应该可以完成这项工作。

      如果您需要更多信息,请研究适当的文件加密技术。

      请注意,如果您关闭应用程序,锁定将不再有效。

          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(); }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 2018-12-22
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多