5

さて、私はこのことについてたくさんの質問を見てきましたが、それでも、誰も私の質問に答えません。実際、私が見た質問はそれぞれ異なります。このアクセスのことは、本当に面倒なプログラマーのようです。

コードを確認してください:

DirectoryInfo Dir1 = Directory.CreateDirectory(Desktop + "\\DIR1");
DirectoryInfo Dir2 = Directory.CreateDirectory(Desktop + "\\DIR2");
//* Lets Create a couple of SubDirs in DIR1
for (int i = 0; i < 5; i++)
{
  // this will create 5 SubDirs in DIR1, named Sub1, Sub2 ... Sub5.
  Dir1.CreateSubdirectory("Sub" + (i + 1).ToString()); 
  //* lets create 5 text files in each SubDir:
  for (int j = 0; j < 5; j++)
  {
    File.Create(Dir1.FullName + "\\Sub"+(i+1).ToString() + "\\text"+(j+1).ToString() + ".txt"); 
  }
}

//* Lets Move all what we created in DIR1 to DIR2 (THIS IS WHERE I'M GETTING THE EXCEPTION
Directory.Move(Dir1.FullName, Dir2.FullName + "\\DIR1");
// I also Tried Dir1.MoveTo(Dir2.FullName + "\\DIR1");

スタックトレース:

at System.IO.DirectoryInfo.MoveTo(String destDirName)
at Directory_Class.Program.Main(String[] args) in c:\users\vexe\documents\visual studio 2010\Projects\Directory_Class\Directory_Class\Program.cs:line 207
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

そしてもちろん、私はいつものことを試しました:

DirectorySecurity DirSec = Dir1.GetAccessControl();
string user = Environment.UserName;
DirSec.ResetAccessRule(new FileSystemAccessRule(user, FileSystemRights.FullControl, AccessControlType.Allow));
Dir1.SetAccessControl(DirSec);

しかし、それは少し変わりませんでした!

また、dir1->プロパティ->セキュリティ->編集->追加->全員を入力(選択するオブジェクト名を入力)-> ok->全員にフルコントロールを右クリックして、権限を手動で変更してみました。(また、私のユーザーアカウントも完全に制御できることを確認しました)

ヒントをいただければ幸いです

4

3 に答える 3

5

これは Access Denied 例外ですが、ファイルへの開いている参照があるため、テキスト ファイルが使用中で移動できないようです。

File.Createメソッドは、ファイルを変更する前に閉じる/破棄する必要があると私が想像する FileStream オブジェクトを返します。

内部ループに対して次のことを試してください。

  for (int j = 0; j < 5; j++)
  {
    using(var fs = File.Create(Dir1.FullName + "\\Sub"+(i+1).ToString() + "\\text"+(j+1).ToString() + ".txt"))
    {
        //fs.WriteByte(...);
        fs.Close();
    }
  }
于 2012-08-17T13:07:07.187 に答える
1

まず、文字列連結の代わりに Path.Combine を使用する必要があります。
次に、スタック トレースは、例外がスローされるほど役に立ちません。

ただし、これを行うことで問題が解決する可能性があると思います:

Directory.Move(Dir1.FullName, Dir2.FullName);

これで問題が解決した場合、移動しようとしている DIR1 サブディレクトリに問題があります。

于 2012-08-17T13:09:59.610 に答える
0

デバッグとして、(高度なセキュリティ設定の下で) 2 つのフォルダーに失敗の監査を設定する必要があります。すべての失敗を監査するように全員を設定してから、操作を再試行してください。実行している OS のバージョンに応じて、操作に使用されているユーザー アカウントと不足している権限を取得する必要があります。また、他のすべてのアクセス許可を上書きするため、フォルダーに拒否アクセス許可が設定されていないことを確認してください。セキュリティ イベント ログを参照してください。操作の失敗の監査がない場合、それはアクセス許可の問題ではありません。

于 2012-08-17T13:11:06.923 に答える