>CFile::Renameで書き込み途中のファイルがリネームされて困っ入力中の回答があります。ページを離れますか?※ページを離れると、回答が消えてしまいますページを離れるA回答を続ける入力中のお礼があります。11:51回答数:5件CFile::Renameで書き込み途中のファイルがリネームされて困っています。ファイル書き込み中のファイルはリネームしない方法はあるのでしょうか?ファイルのリネーム(CFile::Rename)関数を使用してフォルダ内にあるファイル名をリネームする処理を作成しています。フォルダ内にはA_で始まるファイルが複数存在し、一定周期で別のスレッドからA_で始まるファイルが書き込まれている状態です。私が作成している処理は、そのフォルダにA_で始まるファイルが存在する場合に、A_をRename関数でB_にリネームしています。ここで、別スレッドがA_で始まる新しいファイルを書き込みしている最中に私が作成している処理でRename関数が実行されると、基本的にはExceptionが発生するのですが、Exceptionが発生せずに書き込み途中のファイルがRenameされてしまっています。1.A_XXX001.txtに書き込み中(100行目まで書き込み完了)2.Rename処理が実行される。10:02)結果:B_XXX001.txtファイルは不完全なファイルとして作成されてしまっています。このような現象が起こってしまっています。どなたかご教授願います。通報するこの質問への回答は締め切られました。13:17もう見てないかもしれませんが・・・Mutex等で排他制御をする場合、排他にしたい操作全部にロック操作を追加します。今回の場合だとファイル書き込みとファイル名変更ですね。参考ソースがあるのでそこに追記してみました。{エラーログ出力}lockFile.Unlock();これと同じようにしてファイル名変更ロジックにLock~Unlockを追加します。この場合だと1行書き込んだタイミングでロックが解除されますので、全部書き込むまでロックする場合は、そのロジック全体をLock~Unlockで囲う必要があります。17:24書き込み側のスレッドで、A_XXX001.TXTのファイル名でいきなり書くのでなく、TEMP_XXXのようなファイル名で書いて、書き込み完了後、そのスレッドが、A_XXX001.TXTのファイル名にリネームにしてはいかがでしょうか。(パフォーマンス等は、考慮していません。14:48A_XXX001.txtをリネームする前に、中身を確認して、「不完全」だったらリネームしないという方法はどうでしょうか。12:51ある資源(今回の場合はファイル)に対して複数のスレッドからアクセスするシステムの場合、クリティカルセクションなりセマフォなりを利用して複数のスレッドが同じ資源に同時にアクセスしないようにするのが常識です。開発環境がわかりませんので、マルチスレッド等のキーワードでググってください。ありがとうございます。排他制御を掛けるのはファイル書き込みの部分に当たるのでしょうか?書き込みをしているファイルを排他制御対象にすることで、そのファイル名を変更するRenameはロックされているファイルはRenameしなくなるのでしょうか?現在、書き込み処理は以下のようになっています。LPCTSTRの型に変換C言語・C++・C#CStringからchar*への型変換について教えてください。ファイルの名前を変更したいです&ファイルを指定して削除したいです。LPCTSTRの型に変換C言語・C++・C#CStringからchar*への型変換について教えてください。ファイルの名前を変更したいです&ファイルを指定して削除したいです。CImage::ReleaseDC()のエラーで困っています。回答数ランキングです。書き込みファイこのQ&Aと関連する良く見られている質問Qファイルやディレクトリの存在確認を行う方法ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。何か組み合わせて作るものなのでしょうか?perlとか便利な演算子があるのですが、C/C++って器用ではないですね。Windows2000です。使えとか書いてあるけど。LPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。Open()でファイル名を与えるところAPIではないようですが......。http://msdn.microsoft.com/ja-jp/library/ee247566.aspxならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。APIを探しています。なく、純粋にC言語から呼び出せるものってないでしょうか?よろしくお願いします。新しいファイル名);があります。他の回答も見るQCStringからchar*への型変換について教えてください。CString型/char型がありましたが、CString型をchar*型に変換する方法を教えていただければありがたいです。例が載ってないのでよくわかりませんでした。目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。LPCTSTRで文字列ポインタが得られます。CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。Classリファレンス→CString→クラスメンバで確認してください。他の回答も見るQGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・お世話になっています。iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。現在まで、理解した点がwindows.hのインクルードを記述するところ辺りです。iniファイルは下記のようなレイアウトです。---<mst.ini>----------------------------[user]name=usernameID=userid[pc]pcname=FMV----------------------------------------#include<windows.h>は記述することまでは分かりましたが、以下から進みません。GetPrivateProfileString("")初心者で申し訳ありませんが、お助け願います。Aベストアンサーこんにちは。itohhといいます。サンプルを載せておきます。mst.iniファイル内の[user]セクションのnameキーの値を取得する。解説:iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。itohhといいます。サンプルを載せておきます。mst.iniファイル内の[user]セクションのnameキーの値を取得する。読み込んだ値を格納するエリア...続きを読む他の回答も見るQCStringのFindで文字列検索を行いたいのですがこんにちは。いつもお世話になっております。CStringのFindメソッドで文字列検索を行っているのですが、文字列ではなくコードで検索が行われてしまい困っています。文字列が存在するという結果が帰ってきます。コードではなく文字そのものの検索をするにはどうしたらよいでしょうか?基本的なことで申し訳ありませんが、ご教示下さい。VC6.0AベストアンサーCString::Findメソッドは、1バイトごとの検索を行うので、そのような結果になってしまいます。このような処理を避けるには、CString::Findではなく、_mbsstrを利用します。詳しくは、MSDNを参照のこと。http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_strstr.2c_.wcsstr.2c_._mbsstr.aspどちらかといえば、_tcsstrを利用してUnicodeとMBCSの両方に対応できるようにしておいたほうがいいです。#この場合、_UNICODEもしくは_MBCSのどちらかが設定されていないと正しく動きません。*注意*この関数はANSIに互換性がないようですので、Windows以外では利用できない可能性があります。上記のような関数を使わず、自分で実装するなら、以下の参考URLを参考にしてください。参考URL:http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0002d.shtmlCString::Findメソッドは、1バイトごとの検索を行うので、そのような結果になってしまいます。このような処理を避けるには、CString::Findではなく、_mbsstrを利用します。詳しくは、MSDNを参照のこと。http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_strstr.2c_.wcsstr.2c_._mbsstr.aspどちらかといえば、_tcsstrを利用してUnicodeとMBCSの両方に対応できるようにしておいたほうがいいです。#この場合、_UNICODEもしくは_MBCSのどちらかが設定されていないと...続きを読む他の回答も見るQセマフォとmutexの違いは?排他制御としてセマフォとmutexがありますが、この二つの違いがよくわかりません。・セマフォ...プロセス間排他制御。複数ロックがかけられる。・mutex...スレッド間排他制御。言うような違いがあるようなのですが、これだけの差なんでしょうか?(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)また、セマフォをスレッド間排他制御に用いたり、mutexをプロセス間排他制御に用いることは可能なのでしょうか?可能だとしたら、これらが2種類存在する理由も教えていただきたいです。>一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。これ以上の違いはないと言うことでしょうか?「一般論」と書いた意味を取り落とされているのではないかと思います。「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。>一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。これ以上の違いはないと言うことでしょうか?「一般論」と書いた意味を取り落とされているのではないかと思います。「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む他の回答も見るQDWORDの実際の型は何でしょうかVC++.NETの環境です。数値を比較しようとしました。int型のようにも見えます。int型であると記述されています。int型ならこのワーニングはでないはずなのですが、なぜでるのでしょうか。DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。DWORD;"と宣言されています。Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。C++でプログラムを行っていたのですが、プログラムを実行すると、エラーが発生します。いうメッセージが出てきました。Violationについて調べたのですが、いまひとつ理解できません。これはどういうことなのでしょうか?また、解決策をご教授願えないでしょうか?初心者なので、可能な限り専門用語などを使わない、わかりやすい解説をしていただけると幸いです。Aベストアンサーアクセス違反。システム自身の保護機能発動。アクセスできないメモリにアクセスしてる。書式指定箇所を埋めるのにパラメータが足りないなどが良く引っかかる点。ここに処理を書く}という関数が必要なようです。Inc.Q質問する(無料)Q&A検索goo検索gooIDで新規登録・ログイン新規登録する(無料)会員の方はこちら外部サービスのアカウントで新規登録・ログインYahoo!で新規登録・ログインGoogleで新規登録・ログインTwitterで新規登録・ログインFacebookで新規登録・ログインdアカウントで新規登録・ログイン※各種外部サービスのアカウントをお持ちの方はこちらから簡単に登録できます。お客様の許可なしに外部サービスに投稿することはございませんのでご安心ください。会員でない方、会員になるとあなたも質問や回答ができるようになります!!親切・丁寧な回答が集まる場30分以内に回答がもらえ回答数は平均3件!匿名(ニックネーム)での投稿なので。