現在、Path.GetTempPath()
を使用してログファイルを書き込む場所を見つけていますが、最近、返されたパスが予期したものではないユーザーのマシンに出会いました。
通常、返されるパスはC:\ Documents and Settings\[userid]\Local Settings\Tempですが、この場合はC:\ Temp
通常、これは問題にはなりませんが、何らかの理由で、問題のユーザーがC:\ Tempに書き込むためのアクセス権を持っていませんでした。
環境変数を再確認しましたが、USER環境変数は期待通りに指していましたC:\ Documents and Settings\[userid]\Local Settings\Temp、SYSTEM環境変数は指していました- C:\ WINNT\Temp。
それで... Path.GetTempPath()
はどこから値を取得していますか?グループポリシーレジストリ?
Googleで検索しましたが、役に立ちません。
(Reflectorを使用)Path.GetTempPath()
は最終的にWin32関数 GetTempPath (kernel32.dllから)を呼び出します。この状態のMDSNドキュメント:
GetTempPath関数は、環境変数の存在を次の順序でチェックし、見つかった最初のパスを使用します。
- TMP環境変数で指定されたパス。
- TEMP環境変数で指定されたパス。
- USERPROFILE環境変数で指定されたパス。
- Windowsディレクトリ。
また、パスが実際に存在するか、または書き込むことができるかどうかをチェックしないと述べているため、最終的には存在しないパス、またはアクセスできないパスへのログファイル。
単一のディレクトリで65536に達した場合、フレームワークはこれ以上作成せず、アプリが爆発するため、一時ファイルを消去する必要があることを認識することは非常に重要です!
それらは数か月にわたって蓄積され、次のようなメッセージが表示されます。
_System.IO.IOException: The file exists.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.Path.InternalGetTempFileName(Boolean checkHost)
at System.IO.Path.GetTempFileName():
_
tFSは、ビルドを試みるときにこれを提供します。
_TF215097: An error occurred while initializing a build for build
definition XXXXX: The file exists.
_
必要なことは、Path.GetTempPath()
フォルダーを参照し、_del tmp*
_を呼び出すだけです。
注:一時ファイルを作成するASP.NETアプリケーションがある場合、その一時ディレクトリは現在ログインしているユーザーとはおそらく異なるでしょう
疑わしい場合(またはパニックの場合)、aspxページを作成して、使用されている場所を印刷します。
_ TempPath.aspx
<%@ Page Language="C#"%>
Temp path: <%= System.IO.Path.GetTempPath() %>
_
NetworkService
として実行しているとき、私は
_ C:\Windows\TEMP\
_
AppPool(www.example.comという名前)として実行する場合、パスは次のようになります。
_ C:\Users\www.example.com\AppData\Local\Temp
_
PS。これは、ファイル名が増えたためにファイルを後で削除しても発生する可能性があると思います。
コンソールアプリケーションの場合、GetTempPath()がローカルユーザーのDocuments&Settings\user\Local Settings\Tempパスを戻すことができることに気づきました。クライアントから実行されているWebアプリ。前者の場合、大したことはありません-アプリを実行しているアカウントにはそのフォルダに対する権限があります。後者では、アプリプールIDアカウント(またはWebアプリのWeb.configファイルで偽装するために使用するアカウント)がC:\ WINDOWS\Tempに対する権限を持っていない場合、それは大したことかもしれませんサーバー(これは大きなチャンスではありません)。だから私のコンソールアプリの場合、一時ファイルがどこに書かれているのか疑問の余地はありません。文字列をINIファイルにハードコーディングすることは私にとって最高で最も簡単です。 -web.configでコーディングし、ConfigurationManager.AppSettings ["myKey"]を使用して取得するか、Webアプリの場合、この関数を使用してファイルをASP Temporary Filesそこにフォルダとそれで動作します:
public static string findFileDirectory(string file)
{
// Get the directory where our service is being run from
string temppath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
// Ensure proper path notation so we can add the INI file name
if (!temppath.EndsWith(@"\")) temppath += @"\";
return temppath;
}
次のように呼び出します:
string tempFolderPath = findFileDirectory("Web.config");
tempFolderPath = tempFolderPath.Replace(@"\\", @"\");
以前にPath.GetTempPath()を使用した場所の代わりに「tempFolderPath」を使用します。この関数は素晴らしい動作をします。コードでこの邪悪なGetTempPath()メソッドの代わりに使用しているので、ASP Temp Filesフォルダーは操作に必要なすべてのアクセス許可(DOMAIN\NETWORK SERVICEおよびApp Pool IDアカウントにはフルコントロールが必要です)。tempFolderPathは末尾のスラッシュで終わるため、変数/ファイル名と直接連結して正しいパスを取得します。
-トム
追伸その機能を動作させるには、System.IOとSystem.Reflectionの2つの名前空間を追加する必要があります。
_C#
_を使用してMacOS
で_Mono Framework
_を使用している場合、Path.GetTempPath()
によって返される値は環境変数TMPDIR
の値です。
_echo $TMPDIR
_を実行すると、通常次のような値が返されます。
_/var/folders/{2 character random-string}/{random-string}/T
_
GetTempPath 関数を呼び出します。ドキュメントは、チェックする環境変数について説明しています。
以下を使用して、データの適切な場所を判断してください。
Environment.GetFolderPath(Environment.SpecialFolder folder);
Where Specialfolder
// Summary:
// Specifies enumerated constants used to retrieve directory paths to system
// special folders.
[ComVisible(true)]
public enum SpecialFolder
{
// Summary:
// The logical Desktop rather than the physical file system location.
Desktop = 0,
//
// Summary:
// The directory that contains the user's program groups.
Programs = 2,
//
// Summary:
// The directory that serves as a common repository for documents.
Personal = 5,
//
// Summary:
// The "My Documents" folder.
MyDocuments = 5,
//
// Summary:
// The directory that serves as a common repository for the user's favorite
// items.
Favorites = 6,
//
// Summary:
// The directory that corresponds to the user's Startup program group.
Startup = 7,
//
// Summary:
// The directory that contains the user's most recently used documents.
Recent = 8,
//
// Summary:
// The directory that contains the Send To menu items.
SendTo = 9,
//
// Summary:
// The directory that contains the Start menu items.
StartMenu = 11,
//
// Summary:
// The "My Music" folder.
MyMusic = 13,
//
// Summary:
// The directory used to physically store file objects on the desktop.
DesktopDirectory = 16,
//
// Summary:
// The "My Computer" folder.
MyComputer = 17,
//
// Summary:
// The directory that serves as a common repository for document templates.
Templates = 21,
//
// Summary:
// The directory that serves as a common repository for application-specific
// data for the current roaming user.
ApplicationData = 26,
//
// Summary:
// The directory that serves as a common repository for application-specific
// data that is used by the current, non-roaming user.
LocalApplicationData = 28,
//
// Summary:
// The directory that serves as a common repository for temporary Internet files.
InternetCache = 32,
//
// Summary:
// The directory that serves as a common repository for Internet cookies.
Cookies = 33,
//
// Summary:
// The directory that serves as a common repository for Internet history items.
History = 34,
//
// Summary:
// The directory that serves as a common repository for application-specific
// data that is used by all users.
CommonApplicationData = 35,
//
// Summary:
// The System directory.
System = 37,
//
// Summary:
// The program files directory.
ProgramFiles = 38,
//
// Summary:
// The "My Pictures" folder.
MyPictures = 39,
//
// Summary:
// The directory for components that are shared across applications.
CommonProgramFiles = 43,
}