2016-03-29 13 views
0

ファイルの内容を置き換え、アクセス権を変更する必要があります。私は、ファイルを読んで削除し、更新された内容で新しいファイルを作成することでそれをやっています。ファイルからファイルへのアクセス許可をコピーする

私は次があります。

static void Main() 
{ 
    var file = new FileInfo(@"C:\temp\test.txt"); 

    var file1Security = file.GetAccessControl(AccessControlSections.All); 

    string s; 

    using (var stream = file.OpenText()) 
    { 
     s = stream.ReadToEnd(); 
    } 

    s += "\n" + DateTime.Now; 

    file.Delete(); 

    using (var stream = file.OpenWrite()) 
    { 
     using (var writer = new StreamWriter(stream)) 
     { 
      writer.Write(s); 
     } 
    } 

    file.SetAccessControl(file1Security); 
} 

しかし、これは新しいファイルにユーザーの権限をコピーしません。

ファイルの内容を置き換え、そのユーザーのアクセス許可を保持するにはどうすればよいですか?

+1

がドキュメントに注釈セクションを参照してください - それはあなたが1つのファイルからファイルセキュリティをコピーすることはできません説明します別のものはそれを行う方法を示すために続けます。 https://msdn.microsoft.com/en-us/library/system.io.file.setaccesscontrol(v=vs.110).aspx – PaulF

+0

私はすでにあなたに答えがあるのを見ていますが、既存のファイルを削除して新しいファイルを作成するのではなく、既存のファイルを書き直すことが効率的で安全です。 –

+0

@HarryJohnstonそれは私が最後にやったことですが、ファイルを切り捨てることができるという事実を忘れてしまいました! – BanksySan

答えて

3

this documentationによれば、FileSecurityを1つのファイルからコピーして別のファイルに適用することはできません。

FileSecurityオブジェクトを新規に作成し、古いものから新しいものにアクセス制御リストをコピーしてから、そのオブジェクトを適用する必要があります。新しいファイルをファイルに追加します。

void ApplySecurityFromOneFileToAnother(FileInfo source, FileInfo destination) 
{ 
    var sourceSecurityDescriptor = source.GetAccessControl().GetSecurityDescriptorBinaryForm(); 
    var targetSecurity = new FileSecurity(); 
    targetSecurity.SetSecurityDescriptorBinaryForm(sourceSecurityDescriptor); 
    destination.SetAccessControl(targetSecurity); 
} 

ファイルを置き換えているので、あなたはもちろん、それを分割する必要があるだろう - そして、最初に古いファイルからセキュリティを取得し、それを書き換えています後に同じファイルに適用します。

+0

それはトリックでした! – BanksySan

0
FileSecurity file1Security = file.GetAccessControl(AccessControlSections.All); 
file1Security.SetAccessRuleProtection(true, true); 

ここでコピーしたコードの最初の行に "var"を置き換え、下に行を追加してみてください。この最後の部分では、アクセスルールが適用されます。

0

てみ最初にDirectoryInfoを使用します

DirectoryInfo dInfo = new DirectoryInfo(@"C:\temp\test.txt"); 
DirectorySecurity dSecurity = dInfo.GetAccessControl(); 

として最後の行を変更:

dInfo.SetAccessControl(dSecurity); 
関連する問題