2

Cで開発されたアプリケーションがあります。このアプリケーションは複数のプラットフォームでサポートされています。ファイル転送プロトコルを介して別のマシンまたはローカルマシン上の他のディレクトリにファイルを転送する機能が1つあります。一時的な名前でファイルを転送できる機能を含めたいのですが、転送が完了したら、ファイルの名前を正しい名前(実際のファイル名)に変更したいと思います。

単純なrename()関数を使ってみました。UnixおよびLinuxマシンで正常に動作します。ただし、Windowsでは機能しません。13(許可拒否エラー)のエラーコードが表示されます。

まず、msdnをチェックインして、ファイルなどにいくつかのアクセス許可を付与する必要がある場合の名前変更の機能を確認しました。

  1. ファイルに完全なアクセス許可を付与しました(777としましょう)。
  2. 他のいくつかの投稿で、ファイルの名前を変更する前にファイル記述子を閉じる必要があることを読みました。私もそうしました。それでも同じエラーが発生します。
  3. ファイルの所有者とアプリケーションの所有者について言及されている他の投稿はほとんどありません。アプリケーションはSYSTEMユーザーとして実行されます。(ただし、アプリケーションで次のように同じ名前変更関数を試したため、これは動作に影響を与えないはずです。

これは私のアプリケーションからはうまく機能します:

rename("C:/abc/aaa.txt","C:/abc/zzz.txt");

しかし

rename(My_path,"C:/abc/zzz.txt");

My_path印刷時に表示される場合は機能しませんC:/abc/test.txt

ファイルの名前を変更するにはどうすればよいですか?複数のプラットフォームで動作するために必要です。それを機能させるために私が試みるべき他のことはありますか?

4

2 に答える 2

4

私はこれと同じ問題を抱えていましたが、問題は少し異なりました。次の一連の関数呼び出しを実行すると、名前変更関数を呼び出したときに「アクセスが拒否されました」というメッセージが表示されました。

fopen
fwrite
rename
fclose

解決策は、名前を変更する前に、最初にファイルを閉じることでした。

fopen
fwrite
fclose
rename
于 2012-11-14T16:33:55.063 に答える
1

もしも

rename("C:/abc/aaa.txt","C:/abc/zzz.txt");

動作しますが

rename(My_path,"C:/abc/zzz.txt");

プログラムのまったく同じ場所 (つまり、ある行を別の行に置き換えて変更を加えない) ではない場合、変数 My_path に何か問題がある可能性があります。この変数の型は何ですか? char 配列の場合 (これは C であるため)、適切に終了していますか? そして、それは「C:/abc/aaa.txt」と正確に同じですか?

(これを回答としてではなくコメント/説明として投稿できたらいいのにと思いますが、私の担当者は十分ではありません:( )

于 2012-08-07T07:12:24.987 に答える