if ( !m_File.Open( m_FileName + _1.txt,File::modeCreate|CFile::modeWrite ),
&fileException )
{
TRACE( Can't open file %s, error = %u\n, m_FileName
+ _1.afd, fileException.m_cause );
}
現状のソースでは、新規に作成されるファイルがxxx.txt_1.afdとなります。
実現させたいのは、xxx_1.txtと表示できるようにしたいのと、
もし、xxx_1.txtのファイルが既に作成されていたら、
xxx_2.txt、xxx_3.txtと随時変更させたいと考えております。
ご存知の方おられましたらアドバイス頂けると有難いです。
よろしくお願い致します。
m_Fileって何?とか m_FileNameって何?とか色々情報が落ちているように
思いますが、
話からするとm_FileNameにxxx.txtと入っているからではないかと思います。
関数の使い方というよりロジックとかの問題ではないかと思うのですが。
少なくともあげられているソースの中に原因があるようには思えないです。
あと、TRACEでは、m_FileName + _1.afdとしているので
xxx.txt_1.afdが表示されるのはわかるんですが、
作成されるファイルもxxx.txt_1.afdなんでしょうか?
上記のソースを見る限りでは、xxx.txt_1.txtとなりそうな気がします。
>実現させたいのは、xxx_1.txtと表示できるようにしたいのと、
>もし、xxx_1.txtのファイルが既に作成されていたら、
>xxx_2.txt、xxx_3.txtと随時変更させたいと考えております。
やりたいことはわかりました。
どうぞそのように実装してください。
>ご存知の方おられましたらアドバイス頂けると有難いです。
>よろしくお願い致します。
何のアドバイスが欲しいのですか?
やってみてそれでも行き詰ったのなら
その時点でのコードとどの部分で行き詰ったのか明確にしてください。
代わりにコーディングして欲しいということではないですよね?
まささんのコード、コンパイルできるのかすら不明なんですけど、
アドバイスって事なら・・・
・ CreateFile で CREATE_NEW でオープンすると既存ファイルがあると失敗するみたい
です。
・ あとは FindFirstFile で、実際に探してみるとかかな。
詳しくは MSDNをどうぞ。ちなみにSDKです。
# MFCでもあるのかな?
VC++初心者でコーディングの方法もあまり理解していないので、
PATIO様、REE様には大変ご迷惑をお掛けしましたことを
深くお詫び申し上げます。大変失礼致しました。
また、助言頂き有難うございました。
自分自身もう一度見つめ直してみました。
既存のデータファイルに追加データを書き足し、
新しいファイル名で出力させるロジックを組んでいます。
その中で当方が実現させたいのは、新しいファイルデータのファイル名を
現状xxx.txtから、xxx_1.txtという名前に変更させて出力したいのです。
ファイル名が固定なら、xxx_1.txtにすれば良いのですが、
ファイル名は随時変わる為、上記の方法では実現できません。
そこで、※1のソースを参照頂きたいのですが、
m_FileName + _1.txtとしたところ、
xxx.txt_1.txtというファイル名で出力されました。
上記の様になってしまうのは、m_FileNameにファイルのパスが
入っているからなのでしょうか。。
出力されるファイル名をxxx_1.txtとするには、
ファイルパスが入ったm_FileNameを使用しないで、
別の方法でファイル名をxxx_1.txtの様に表示することは可能なのでしょうか?
現状のソースをもう少し具体的に載せます。
POSITION pos = dlg.GetStartPosition();
while ( pos != NULL ){
m_FileName = dlg.GetNextPathName( pos );
void CExtended_data_Creation1Dlg::OnOK()
{
CFile m_File;
CFileException fileException;
CFileStatus status;
if ( !m_File.Open( m_FileName, CFile::modeRead ), &fileException )
{
TRACE( Can't open file %s, error = %u\n, m_FileName,
fileException.m_cause );
}
/*ファイルのステータス取得 */
m_File.GetStatus( status );
void *ptr1;
void *ptr2;
ptr1 = malloc( status.m_size );
ptr2 = malloc( 68 );
m_File.Read(ptr1,status.m_size);
※1 /* 書き込みファイルを開く */
if ( !m_File.Open( m_FileName + _1.txt,
CFile::modeCreate|CFile::modeWrite ), &fileException )
{
TRACE( Can't open file %s, error = %u\n, m_FileName
+ _1.txt, fileException.m_cause );
}
/* 追加データ書き込み処理
・
・
m_File.Write(ptr1,status.m_size);
m_File.Write(ptr2,68);
長文になってしまい、申し訳ありません。
よろしくお願いいたします。
こうでしょうか。
1.開いたファイル名(m_Filename)を、ファイル名と数字と拡張子に分離する。
例:HOGE_1.TXT → HOGE、1、.TXT に分離
HOGE.TXT → 数字はゼロとみなして、HOGE、0、.TXT に分離
2.ファイルを保存するときに、数字をインクリメント(+1)する。
3.ファイル名を組み立てる。
ファイル名の分解は後ろからやってくるとよいでしょう。
>出力されるファイル名をxxx_1.txtとするには、
>ファイルパスが入ったm_FileNameを使用しないで、
>別の方法でファイル名をxxx_1.txtの様に表示することは可能なのでしょうか?
m_FileNameをそのまま使うことにとらわれずに、
そこから必要な部分だけを取り出すことを考えてください。
う~ん、
>現状xxx.txtから、xxx_1.txtという名前に変更させて出力したいのです。
ってことは、OnOK()の頭の時点で、
「m_FileName == ○\\○○\\xxx.txt」
を想定していて、
>※1 /* 書き込みファイルを開く */
> if ( !m_File.Open( m_FileName + _1.txt,
> ・
> ・
> ・
とやってるので、
当然「m_FileName == ○\\○○\\xxx.txt_1.txt」
になるのでは?
デバッグはちゃんとしましたか?
ステップ実行をうまく使って、
変数がどう変わっていくのか確認してみてください。
あと、意図することをやるとするならば、
「m_FileName」のファイル名(拡張子を除いた部分のみ)を取得して、
「_1を付加すると良いかと思います。
オープンする前に「xxx_1」の存在チェックをして
存在するなら、番号を繰り上げてやる必要があるかもしれませんが・・・。
訂正
> 2.ファイルを保存するときに、数字をインクリメント(+1)する。
2.ファイルを保存するときに数字をインクリメントして仮のファイル名を組み立て、
そのファイル名のファイルが無いことを確認する。
ある場合は、さらにインクリメントを続ける。
ご存知かもしれませんが、
パスを分解するとき「_splitpath」なんてものを使うと便利かもしれませんよ。
皆様、アドバイス有難うございます。
m_FileNameをからファイル名のみを取得し、
さらに、数字の部分は保存する際に存在チェックをして
なければそのまま、あれば+1をする。
という方向で実装していきたいと思います。
大変助かりました。
どうも有難うございました。