VisualStudioでロックをとらない状態で編集することによる影響について

2024-06-04T10:02:08.1966667+00:00

お世話になっております。

現在VisualStudioを用いたドキュメントのバージョン管理を実施しようと考えています。

そこで、ユーザによる誤操作による影響を最小限に抑える方法を模索しているところです。

本題としましては、VisualStudioの各ドキュメントをロックしない状態でも編集ができないような設定を行うことが可能でしょうか。

(ロックをしなければ編集・ドキュメントの更新ができない状態にしたいと考えています。)

上記設定ができるのであれば、設定の方法や手順も併せて展開していただけると幸いです。

使用しているVisualStudioは「VisualStudio2013」です。

以上、どうぞよろしくお願いいたします。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
55 件の質問
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 8,061 評価のポイント MVP
    2024-06-04T15:30:17.0966667+00:00
    1. ユーザーアカウントの権限では書き込み変更できないフォルダにドキュメントを置く。
    2. 「メニュー->ツール->オプション->環境->ドキュメント->読み取り専用ファイルの編集を有効にし、保存時に警告する」のチェックを外す。
      (各ファイルはファイルエクスプローラーで読み取り専用にしておく。)
    3. 拡張機能を作って、読み取り専用を偽装する
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.ComponentModel.Design;
    using Microsoft.Win32;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell.Interop;
    using Microsoft.VisualStudio.OLE.Interop;
    using Microsoft.VisualStudio.Shell;
    using System.Linq;
    
    namespace Company.VSPackage1
    {
    
        [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
        [ProvideMenuResource("Menus.ctmenu", 1)]
        [Guid(GuidList.guidVSPackage1PkgString)]
        [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.NoSolution)]
        [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]
        [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionHasMultipleProjects)]
        [ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionHasSingleProject)]
        public sealed class VSPackage1Package : Package
        {
            public VSPackage1Package()
            {
            }
    
            #region Package Members
    
            protected override void Initialize()
            {
                base.Initialize();
    
                dte = (EnvDTE80.DTE2)this.GetService(typeof(EnvDTE.DTE));
    
                evDoc = dte.Events.DocumentEvents;
                evDoc.DocumentOpening += evDoc_DocumentOpening;
                evDoc.DocumentOpened += evDoc_DocumentOpened;
    
                evSol = dte.Events.SolutionEvents;
                evSol.Opened += evSol_Opened;
    
                var ev2 = (EnvDTE80.Events2)dte.Events;
                evKeyPress = ev2.TextDocumentKeyPressEvents;
                evKeyPress.BeforeKeyPress += TextDocumentKeyPressEvents_BeforeKeyPress;
    
                try
                {
                    var rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(dte.RegistryRoot);
                    var sc = rk.OpenSubKey("SourceControl", true);
                    sc.SetValue("AllowUncontrolledInMemoryEditing", 0, RegistryValueKind.DWord);
                }
                catch
                { }
            }
    
            private EnvDTE80.DTE2 dte;
            private EnvDTE.CommandEvents evcmd;
            private EnvDTE.DocumentEvents evDoc;
            private EnvDTE.SolutionEvents evSol;
            private EnvDTE80.TextDocumentKeyPressEvents evKeyPress;
    
            void evSol_Opened() { SetFileReadOnly(dte.Solution); }
            void evDoc_DocumentOpened(EnvDTE.Document Document) { SetFileReadOnly(Document); }
            void evDoc_DocumentOpening(string DocumentPath, bool ReadOnly) { SetFileReadOnly(DocumentPath); }
    
            private void SetFileReadOnly(EnvDTE.Solution sol)
            {
                try
                {
                    SetFileReadOnly(sol.FullName);
    
                    foreach (EnvDTE.Project p in sol)
                    {
                        SetFileReadOnly(p);
                    }
                }
                catch { }
            }
    
            private void SetFileReadOnly(EnvDTE.Document doc)
            {
                if (doc == null) return;
    
                try
                {
                    doc.ReadOnly = true;
                    var p = doc.ProjectItem.ContainingProject;
                    SetFileReadOnly(p);
                }
                catch { }
            }
            private void SetFileReadOnly(EnvDTE.Project p)
            {
                if (p == null) return;
    
                if (System.IO.File.Exists(p.FullName))
                {
                    SetFileReadOnly(p.FullName);
                }
    
                try
                {
                    foreach (EnvDTE.ProjectItem pi in p.ProjectItems)
                    {
                        for (short i = 0; i < pi.FileCount; i++)
                        {
                            string path = pi.FileNames[i];
                            SetFileReadOnly(path);
                        }
    
                        try
                        {
                            if (pi.Document != null) { pi.Document.ReadOnly = true; }
                        }
                        catch { }
                    }
                }
                catch { }
            }
            private void SetFileReadOnly(string path)
            {
                try
                {
                    if (System.IO.File.Exists(path))
                    {
                        var attr = System.IO.File.GetAttributes(path);
                        if ((attr & System.IO.FileAttributes.ReadOnly) != System.IO.FileAttributes.ReadOnly)
                        {
                            //ファイル属性変更していいなら
                            System.IO.File.SetAttributes(path, attr | System.IO.FileAttributes.ReadOnly);
                        }
                    }
                }
                catch
                {
                }
            }
    
            void DocumentEvents_DocumentClosing(EnvDTE.Document Document)
            {
                Document.Saved = true;
                Document.ReadOnly = true;
            }
    
            void TextDocumentKeyPressEvents_BeforeKeyPress(string Keypress, EnvDTE.TextSelection Selection, bool InStatementCompletion, ref bool CancelKeypress)
            {
                CancelKeypress = true; //キー操作禁止
            }
    
            #endregion
        }
    }
    

    #VisualStudioの外部のメモ帳などで変更できてもいいのかな

    0 件のコメント コメントはありません