6

エラーメッセージをログに記録できるようにコードを記述しようとしていました。ファイルに日付の名前を付けようとしていて、毎日新しいログ ファイルを作成したいと考えています。少し調べてみたところ、次のコードがありました...

class ErrorLog
{
    public void WriteErrorToFile(string error)
    {
        //http://msdn.microsoft.com/en-us/library/aa326721.aspx refer for more info
        string fileName = DateTime.Now.ToString("dd-MM-yy", DateTimeFormatInfo.InvariantInfo);

        //@ symbol helps to ignore that escape sequence thing
        string filePath = @"c:\users\MyName\mydocuments\visual studio 2012\projects\training\" +
                            @"discussionboard\ErrorLog\" + fileName + ".txt";

        if (File.Exists(filePath))
        {
           // File.SetAttributes(filePath, FileAttributes.Normal);
            File.WriteAllText(filePath, error);
        }
        else
        {
            Directory.CreateDirectory(filePath);
           // File.SetAttributes(filePath, FileAttributes.Normal)
           //Throws unauthorized access exception
            RemoveReadOnlyAccess(filePath);
            File.WriteAllText(filePath, error);
        }
    }

    public static void RemoveReadOnlyAccess(string pathToFile)
    {
        FileInfo myFileInfo = new FileInfo(pathToFile);
        myFileInfo.IsReadOnly = false;
        myFileInfo.Refresh();
    }

    /*Exception thrown:
     * UnAuthorizedAccessException was unhandled.
     * Access to the path 'c:\users\anish\mydocuments\visual studio 2012\
     * projects\training\discussionboard\ErrorLog\04\12\2013.txt' is denied.
     */
}

同様の問題について議論しているフォーラムを見つけましたが、 File.SetAttrributes(filePath, FileAttributes.Normal) を使用しても役に立たず、RemoveReadOnlyAccess (上記のコードに含まれています) も役に立ちませんでした。フォルダのプロパティを確認すると、読み取り専用とマークされていますが、チェックを外しても再び戻ってきます。フォルダーのアクセス許可を確認しましたが、変更できなかった特別なアクセス許可を除いて、すべてが許可されています。どのように進めるべきかについての提案をいただければ幸いです。 パスへのアクセスが拒否されるのはなぜですか? リンクは同様の問題について説明していますが、そこにリストされている提案で自分のことを機能させることができませんでした。

これを見ていただきありがとうございます。

4

4 に答える 4

6

あなたのパスは奇妙です: "My documents" ディレクトリは "C:\Users\MyName\Documents\" でなければなりません

簡単に修正するために Environment を使用できます。

String myDocumentPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

exeを実行しているユーザーの「マイドキュメント」フォルダーにアクセスすることに注意してください。

2 番目のエラー、CreateDirectory の引数には、ファイルではなくパスが必要です。あなたのように使用すると、ファイル名でサブディレクトリが作成されます。したがって、この名前でファイルを作成することはできません!

これを試して :

String fileName = DateTime.Now.ToString("d", DateTimeFormatInfo.InvariantInfo);

String filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    + @"\visual studio 2012\projects\training\discussionboard\ErrorLog\";
String fileFullName = filePath + fileName + ".txt";

    if (File.Exists(fileFullName ))
    {
        File.WriteAllText(fileFullName , error);
    }
    else
    {
        Directory.CreateDirectory(filePath);

[...]
    }
}
于 2013-04-12T15:06:25.470 に答える
3

考えられる理由:

  • あなたのアプリは、そのパス/ファイルへのアクセスが許可されているアカウントで実行されていません
  • ファイルは、他のプロセスによって書き込み(または読み取りも)のためにロックされています

最初の状況は、プロセスが実行されているアカウントを確認し、そのアカウントに適切な権限があることを確認することで解決できます。

他の状況は、他のプロセスがファイルをロックしているかどうかを確認することで解決できます (たとえば、'WhosLocking' や 'ProcessExplorer' などのツールを使用します)。

于 2013-04-12T15:03:59.057 に答える
1

c: の保護されたフォルダーに書き込むために、アプリを管理者として実行する必要がありました。たとえば、Visual Studio でアプリをデバッグする場合は、「C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe」を右クリックし、「管理者として実行」を選択してください。次に、そこからソリューションを開きます。アプリが c:\ のルートに書き込もうとしていた

于 2015-03-27T21:02:45.227 に答える