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

前に述べたように、アプリケーションは実行時に正常に動作しますが、アプリケーションを閉じると、ロックされたファイルのロックが解除されます。

誰かがそれを行う方法について何か考えがあれば、私は感謝するでしょう。

4

3 に答える 3

5

Lockon aはFileStream、プロセスがアクティブな間、ファイルに排他的にアクセスできることを意味します。ファイルを保護するパスワードとは何の関係もありません。

あなたが望むのはパスワードでファイルを暗号化することのように聞こえます。ファイルクラスは、現在のユーザーに基づいて暗号化/復号化を提供します。または、独自のカスタムパスワードに基づいて暗号化する場合は、System.Security.Cryptography名前空間内のいくつかのクラスを使用して、ここで(ハードコーディングの代わりに)パスワードでファイルを暗号化するサンプルがあります。おそらく入力として受け取るでしょう)http://www.codeproject.com/Articles/26085/File-Encryption-and-Decryption-in-C

セキュリティを正しく行うことは難しいことを覚えておいてください。

于 2012-10-12T23:50:07.447 に答える
2

このFileStream.Lock()メソッドを使用して特定のファイルをロックし、実行中のプロセスのみがそのファイルFileStreamを使用できるようにします。

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

これは、他のプロセスが読み取り/書き込みを行っているファイルに書き込むのを防ぐために設計されたメカニズムであり、このメソッドがMicrosoftExcelなどのアプリケーションで使用されていることを確認できます。

アプリケーションを閉じると、プロセスは実行されなくなり、ファイルのロックが解除されます。

他のアプリケーションがファイルを読み取れないようにすることが目標である場合、いくつかの制限されたオプションがあります。

  1. ファイルを暗号化します。これは、アプリケーションが復号化キーなしでファイルから使用可能な情報を読み取ることができないことを意味しますが、アプリケーションが暗号化されたファイルを開いて変更する可能性があります。
  2. ファイルをCD/DVDなどの読み取り専用メディア、またはリムーバブルストレージに保存し、プラグを抜いて持ち運びます。

他のアプリケーションがファイルを変更しないようにする場合は、Windowsが提供するReadOnlyフラグを確認してください。http://msdn.microsoft.com/en-us/library/system.io.fileinfo.isreadonly.aspx

読み取り専用フラグは無視できるため、これらは依然として安全ではないことに注意してください。

あなたが考える必要があるのは、ファイルへのアクセスを制限したい理由です。これは、アクセスを制限するための最良の戦略を決定するのに役立ちます。

于 2012-10-12T23:56:23.173 に答える
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(); }
        }
    }
于 2012-10-12T23:49:32.750 に答える