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

我正在使用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;
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,您已经接受了我选择的答案。有时候你不需要加密