none
tmpnam_s()を用いた一時ファイルの作成について RRS feed

  • 質問

  • tmpnam_s()を用いて一時ファイル名の作成を行ったファイル名に対して、modeを"wb+"でfopen_s()を用いてファイルを開こうとしているのですが、EACCESのエラーが返されます。


    そこで、以下の3点について教えてください。

    1) tmpnam_sを用いて作成される一時ファイルはどこにつくられるのでしょうか。

    2) アクセス権の問題で正しく動作しないようなのですが、どの設定を見直せばよいのでしょうか。

    3)本問題を解決する為に、確認しなければならない項目は他にありますでしょうか。

    お手数をおかけしてすいませんが、よろしくお願いいたします。


    urax

    2014年4月16日 6:05

回答

  • 一方、管理者権限で実行した場合には、正しく一時ファイルが作成されます。

    関数の返値だけでなく、一時ファイルの存在自体は確認しましたか?

    先述のページの「現在の作業ディレクトリに一意の名前を返します。」の後、日本語版では割と意味不明な記述になっていましたが、英語版では以下のようになっています。

    Note than when a file name is pre-pended with a backslash and no path information, such as \fname21, this indicates that the name is valid for the current working directory.

    つまり、この関数で返されるファイル名というのは、パス情報を含まないファイル名のみであり、かつファイル名先頭にはバックスラッシュがつけられます。

    CreateFile functionの解説からリンクがあるNaming Files, Paths, and NamespacesというページのFully Qualified vs. Relative Pathsという項目に、単一のバックスラッシュで始まる文字列をどう扱うか記述がありますが、それによると絶対パスとされるようです。

    つまり、"\hoge"という文字列をファイル作成関数に渡すと、"X:\hoge"(ドライブはカレントディレクトリに依存)というファイルを作成しようと試みることになります。

    • 回答としてマーク urax 2014年4月16日 10:40
    2014年4月16日 10:03

すべての返信

  • 尚、使用しているOSはWindows 7 Ultimateになります。

    よろしくお願いいたします。


    urax

    2014年4月16日 6:14
  • tmpnam_s、_wtmpnam_s

    に、作業ディレクトリ(カレントディレクトリ)ってはっきり書かれていますが。

    %ProgramFiles%にインストールしていたりして、カレントディレクトリがそのままなら管理者権限で実行しない限りは普通書き込めませんよね。

    Win32APIのGetTempPath関数で取得したテンポラリディレクトリにカレントを事前に移動するとか、GetTempFileName関数でカレントを使わずにファイル名を取得するとか、でどうでしょうか。

    なお、バッチ処理に使うコマンドラインツールを除いて、カレントディレクトリに依存するプログラムはお勧めしません。ファイルダイアログ開いただけで勝手に変わったりしますし。

    2014年4月16日 6:19
  • Hongliangさん、

    確認が不足しており大変失礼しました。。。

    大変すいません。

    Google検索をしたところで、環境変数のTEMPに関連するような記載等を見つけてしまって混乱しておりました。。。


    > %ProgramFiles%にインストールしていたりして、カレントディレクトリがそのままなら管理者権限で実行しない限りは普通書き込めませんよね。

    プログラム自体は、%ProgramFiles%にインストールはしておらず、カレントディレクトリに配置していたのですが、ユーザー権限(管理者権限で実行しない場合)では、

    一時ファイルが作成されませんでした。

    一方、管理者権限で実行した場合には、正しく一時ファイルが作成されます。

    カレントディレクトリに対してはプロパティのセキュリティの項目よりEveryoneに対してフルコントロールの許可を与えているのですが、この設定だけでは不足ということでしょうか。

    引き継を行ったプログラムのサポートを行っているのですが、もし情報ありましたら教えていただけたら幸いです。


    urax

    2014年4月16日 7:00
  • 一方、管理者権限で実行した場合には、正しく一時ファイルが作成されます。

    関数の返値だけでなく、一時ファイルの存在自体は確認しましたか?

    先述のページの「現在の作業ディレクトリに一意の名前を返します。」の後、日本語版では割と意味不明な記述になっていましたが、英語版では以下のようになっています。

    Note than when a file name is pre-pended with a backslash and no path information, such as \fname21, this indicates that the name is valid for the current working directory.

    つまり、この関数で返されるファイル名というのは、パス情報を含まないファイル名のみであり、かつファイル名先頭にはバックスラッシュがつけられます。

    CreateFile functionの解説からリンクがあるNaming Files, Paths, and NamespacesというページのFully Qualified vs. Relative Pathsという項目に、単一のバックスラッシュで始まる文字列をどう扱うか記述がありますが、それによると絶対パスとされるようです。

    つまり、"\hoge"という文字列をファイル作成関数に渡すと、"X:\hoge"(ドライブはカレントディレクトリに依存)というファイルを作成しようと試みることになります。

    • 回答としてマーク urax 2014年4月16日 10:40
    2014年4月16日 10:03
  • Hongliangさん

    丁寧な解説ありがとうございます。

    大変勉強になりました。

    今回は本当にありがとうございました。


    urax

    2014年4月16日 10:40