プロが教えるわが家の防犯対策術!

VC++2005で、tmpfile_s関数を使ってテンポラリファイルをオープンして書き込みましたが、通常どこに作成されるのでしょうか?
一時的なので、見る必要はあまりないのですが、気になりまして・・・

A 回答 (5件)

一時ファイルは、ルート ディレクトリに作成されます


http://msdn.microsoft.com/ja-jp/library/b3dz6009 …

他の人にも言えることですが、
質問する前に検索してみてはいかがですか?

上記はグーグルで最初に出てきたものです。
MSDNの記事なので、信憑性は高いです。
ただ、日本語はまれに誤訳があったり、
肝心な部分が省略されていたりするので、
英語版が一番信頼が置けるのですが.....

それでも、MSDN日本語版は日本語Windows上のC/C++開発をやるには
必見だと確信しています。
一般の掲示板より信頼がおけます。

MSDNは情報がありすぎたり、多少用語や概念に難があるので
(特に初心者には)嫌われるのもわかる気がしますが、

"テンポラリの場所"ぐらいはズバっと書いてあるはずです。
食わず嫌いを直すことを強くお勧めします。

MSDNで疑問に感じたことをこういう掲示板で質問したりするのは、
”ありだと思います"
    • good
    • 0

>一時ファイルは、ルート ディレクトリに作成されます



この文の先頭には「実行したプロセスに環境変数 TMP が与えられていない場合や、環境変数 TMP が指すディレクトリが無効な場合は」が抜けてます。

特に、WinXPなどの「NT系OS」は、ブートドライブのルートディレクトリにファイルを作り過ぎると「NTLDR is missing」が発生し、OSが起動しなくなります。
http://support.microsoft.com/kb/320397/ja

この問題は「NTLDRがルートディレクトリのファイルエントリの32番目よりもうしろに追い出される」と発生するので「たとえ一時的であっても、ルートディレクトリには、絶対に32個以上のファイルを作ってはいけない」です。

なので「一時フォルダをルートディレクトリに作っているとしたら、自殺行為に等しい」ので、そんな事は絶対にありません。

tmpname_s関数を使うと「tmpfile_s関数でファイルが作られる際の、一時ファイルの名前」を取得出来るので、tmpname_s関数を試してみると良いでしょう。

以下、蛇足ですが「NTLDR is missing問題」は、最新版のサービスパックをOSに適用しただけでは問題解決しません。

なぜなら「起動ドライブのブートレコードは、サービスパックを適用しても更新される事はなく、問題を含むバージョンのOSで書かれたブートレコードはずっと問題を含んだまま」です。

問題を解決するには「マイクロソフトから、ブートレコードを更新するツールを入手して、起動ドライブのブートレコードを書き換える必要」があります。

>ただ、日本語はまれに誤訳があったり、
>肝心な部分が省略されていたりするので、

機械翻訳なので誤訳は仕方が無いですが、英語の原文そのものが「肝心な部分が書いてない」ので、翻訳が悪い訳じゃありません。「元から抜けてる」んですから、どうしようもないです。

業界では「オフィシャルな筈のMSの情報が一番信用できない」などと言われてたりします。ANSIで規格化されている筈の標準Cライブラリも、MSのだけ「確かに規格の範囲内だけど、MSだけ独自路線を突っ走って」いて、かなり「困ったちゃん」です。

「MSの言う事だけは信用するな」が鉄則です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
WinXPx64Proで、環境変数TMPをルート以外に設定していますが、
C:\にテンポラリファイルが作成されます。
処理が終わると無くなりますが、お書きになった内容ですと
このままこのアプリを動かすと、何かよくないような感じがしてきました。
貴重な情報ありがとうございました。

お礼日時:2009/05/28 19:14

No.2さん



>この文の先頭には「実行したプロセスに
>環境変数 TMP が与えられていない場合や、
>環境変数 TMP が指すディレクトリが無効な場合は」が抜けてます。

tmpfile_s()とGetTempPath()の仕様を混同されているのではないでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc429356 …

ここには
No.2さんのおっしゃる通り
TMP環境変数が最初に参照される旨記述されています。

もっとも
>「MSの言う事だけは信用するな」が鉄則です。
ですから、この情報も信用してはいけないのですね?

ちょっとお伺いしたいのですが
"「MSの言う事だけは信用するな」が鉄則です"
なら、”業界"の皆さんはどうやって
Windowsプログラミングをしているのですか?

私の周囲にはWindows関係のプログラマが何人もいます。
守備範囲もVBなどで作る一般的なアプリから、
専用のデバイス・ドライバまで幅広いです。
キャリアは当然人によりけりですが、
最古参の人は
Windows 1.xの頃からWinアプリを作っています。

そういう人々は疑問点があるとMSDNで検索したりしてます。
また、アスキー社辺りから出ているMicrosoftオフィシャルの本
を購入して、新技術などを学んでいます。

私も、諸先輩方に学び、ここまでやってきました。

それが、まったくのうそっぱちだったとは!!!!!!
しかも、それ(嘘っぱちだらけであること)が
”業界の常識"であったとは.....

まさに裸の王様ですね。

これから先もWindowsの仕事は続けたいのですが
"業界の常識"となっているサイトや本
(当然、MSが一切関与していないことが条件です。
出典や参考文献、リンク等にMSが出てきたら、
情報の信頼性が根本から揺らいでしまいますので)

を教えてください。

先輩方にも大至急連絡したいので
よろしくお願いします。
    • good
    • 0

ちなみに.....



(どうせ嘘っぱちに決まっているのでどうでもいいのですが,
念のためといことで)

MSDNには確かに機械翻訳の部分も多いですが、
全部ではありません。
機械翻訳の場合はその旨表示されています。

私が"誤記"と言ったのは機械翻訳の誤りのことでは
ありません。
例えば、
http://social.msdn.microsoft.com/Forums/ja-JP/vd …

ことです。
このページには”誤訳"のあったページへのリンクがあります。
リンク先には"機械翻訳"の表示はありません。
(嘘つきのMS、表示をしないなんて朝飯前ですね)
読解力のない私には、”それなりに"きれいな日本語と感じます。
機械翻訳も嫌になるほど読みましたが、雲泥の差です。

(さすが、天下のMS、上質な機械翻訳と質の悪い機械翻訳を
使い分けてまでだましているわけですね。
ほんとにあくどいことこの上ないですね)

それから、私のいう"省略"とは
http://msdn.microsoft.com/en-us/library/aa452850 …
の訳
http://msdn.microsoft.com/ja-jp/library/cc428300 …
のようなものを指します。

英文のremarkにある
AlphaBlend does not support mirroring. If either the width or height of the source or destination is negative, the call to AlphaBlend will fail.

までは訳されています。

AlphaBlend 関数では、ミラー化はサポートされていません。送信元または送信先の幅や高さが負値の場合、この関数は失敗します。

という風に...

しかし、英文ではこの後に続きがあるのですが、
日本語では、記述がありません。

このどこが

>翻訳が悪い訳じゃありません。「元から抜けてる」んですから

というのか、おバカな私には全く理解できないのです。
大変恐縮なのですが、
どうか”暖かいお心で"
おバカの私にも理解できるよう、ご丁寧にご教授下さいませんか?

よろしくお願い申し上げます。

(あー。早く”業界の常識を知りたいです。
Windows 2000/XP用のドライバをリリースしたのですが、
こともあろうにDDKをDLし、作ってしまいました。
きっとこんなことするのはわたしだけなんだろうな。
早く、DDKを全く使用しない”業界の常識"にそったドライバを
リリースしなおさないと大変なことに....)
    • good
    • 0

またまた、連続で申し訳ありません。


なにせ心配性なもので...
プログラマの宿命でしょうか?
ご理解ください。

”業界の皆さん"が利用しているツールについて質問ですが、
当然MSの情報に一切基づかないものであるわけですよね。
私はVC++(正確にはVS2008)とMS製品使っちゃています。
捨てなければなりません。

で、代替品を大至急入手する必要があるわけですが、
どういうものをみなさんはご利用なのでしょうか?

gc++とかも考えたのですがMSのwindows.hとかが必要になってしまいます。
SDKとかも信用できないので利用できませんよね。
どうやって解決なされているのでしょうか?

また、MSに全く頼ることなく、独自の開発環境(ライブラリ等も含む)
となると、乏しい私の知識では、”独自にリバース・エンジニアする"
位しか思いつかないのですが、どのようにして情報を入手されて
いるのでしょうか?

リバース・エンジニアリングというと恐らくMSが黙っていないと思います。
そういう製品を利用して開発するとなると、
私には不安があるのですが...
"業界の常識"で広く使われているのだから、
ライセンスとかは完全にクリアされていると理解しています。

どうやってクリアされているのでしょうか?
そのプロセスをご教授願えませんでしょうか?
私の作った製品で利用者様にご迷惑をかけたくないもので、
心配なのです。
そのプロセスが理解できれば、安心して
VSを葬り去ることができます。

どうか、よろしくお願い申し上げます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!