• ベストアンサー

C ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。 具体的には、↓こうやって指定しました。 sprintf( buff, "%s\\%s", path, filename ); やっていて思ったのですが、 この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。 フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか? もしできるようなら教えて下さい!! よろしくお願いします!

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★回答ではないが余談。 ・koko_u_ さんありがとう。  気づくとアンダーバーの関数名で置き換わっているみたいですね。  他にも気づくといろいろ置き換わっていますね。  C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。 ・ありがとうございました。 ●質問者さんへ。 ・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。  それでは。

参考URL:
http://www5c.biglobe.ne.jp/~ecb/c/12_14.html
pen123
質問者

お礼

みなさん。丁寧な回答ありがとうございます!! とても助かります! さっそく、教えていただいたもの試してみたいと思います!! ありがとうございました!!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

>今、調べたら mkdir() 関数がないね。何で?昔使った記憶があったのに? _mkdir() に置き換えられているようですね。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★回答者 No.1 です。 ・今、調べたら mkdir() 関数がないね。何で?昔使った記憶があったのに?  仕方が無いので Win32 API の CreateDirectory() を使って作成して下さい。  また、Win32 API を使うのならフォルダの有無をチェックしてフォルダが  存在していない場合に作成するようにします。 ・下のようになります。 サンプル: #include <shlwapi.h> #include <windows.h> if ( PathIsDirectory(path) ){ ←フォルダ有無  CreateDirectory( path, NULL ); ←フォルダ作成 } sprintf( buff, "%s\\%s", path, filename ); fp = fopen( buff, "w" );  : fclose( fp ); 参考文献:  http://nienie.com/~masapico/api_PathIsDirectory.html→『PathIsDirectory』  http://nienie.com/~masapico/api_CreateDirectory.html→『CreateDirectory』  http://nienie.com/~masapico/api_MakeSureDirectoryPathExists.html→『MakeSureDirectoryPathExists』  ↑  この関数を使うと一気に深い階層のフォルダを作成できます。  CreateDirectory() では1つづつしかフォルダを作成できません。  つまり c:\path1\path2\path3 というフォルダを順番に  c:\path1  c:\path1\path2  c:\path1\path2\path3  と3段階で作成します。でも、MakeSureDirectoryPathExists() なら一気に作成してくれます。 ・以上。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ファイルのオープンはどのようなコードにしてますか? 一度にフォルダを作成して出力ファイルを作成するなどという便利な命令はありません WinAPIなら hFile = CreateFile( ... ); if (hFile == NULL ) {  DWORD dwError = GetLastError();  if ( dwError == ERROR_PATH_NOT_FOUND ) {   // フォルダーを作成   CreateDirectory(...);   // ファイルの再オープン   hFile = CreateFile( ... );  } else {   // 他のエラーの対処  } } といった具合でしょう # CreateFile/CreateDirectoryの引数などは ヘルプで確認してください

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★先にフォルダを作成させれば良い。 ・単純にフォルダを作成させるのです。  mkdir( path );  sprintf( buff, "%s\\%s", path, filename );  ↑  mkdir() 関数は既にフォルダがあればエラーを返しますが『無視』すれば良いと思います。  そうすれば、フォルダが存在しないと自動的に作成しますのでファイルもエラーにならない。 ・以上。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • WinAPIでフォルダ作成

    先日質問させていただき、 ファイル出力時に、フォルダを作成し、そのフォルダにファイルを出力していく方法をお聞きしたところ、 _mkdir()関数を使い、最初にフォルダを作っておく方法を教わり、 これは上手くいきました。 それとは別に、WinAPIを使い、フォルダの有無を調べ、無い場合は 作成するという方法があるのを教えてもらいました。 WinAPI使ったことないので、良くわからなかったのですが、 丁寧な説明を頂き、ほとんど、コピーして貼り付けるだけだったので 実行してみたのですが、意味のわからないエラーが出てしまいました。 実行した方法は、 #include <shlwapi.h> #include <windows.h> if ( PathIsDirectory(path) ){ ←フォルダ有無  CreateDirectory( path, NULL ); ←フォルダ作成 } sprintf( buff, "%s\\%s", path, filename ); fp = fopen( buff, "w" );  : fclose( fp ); エラーの内容は 構文エラー : 識別子 'DECLSPEC_IMPORT' がシンタックスエラーを起こしました。 というものでした。 エラーの部分は、よく解らないのですが、自分で書いたメインの文ではなく、何かのヘッダ部分?のようでした。 もしかして、WinAPIを使うには、何かインストールしないとマズイのでしょうか?? これだけの説明で、何が悪いのか指摘できるのかわかりませんが、 わかる方いらっしゃいましたら教えて下さい。 何か足りない情報があったら書き込みます! ちなみにもう一つお聞きしたいのは、フォルダのpath指定のところは 相対パスでもいいのでしょうか? 例えば、現在Cファイルがある場所にDATAというフォルダを作りたかったら、 path指定のところは、 PathIsDirectory(DATA) で問題ないのでしょうか? すみませんが、回答お願いします!

  • cvSaveImageで画像を保存する際のフォルダ指定

    現在C++,OpenCVを用いてプログラム内で生成した画像をフォルダを指定して1フォルダ内に100枚程度の画像をどんどん保存していくというプログラムを作成しています。 そこで、フォルダを指定してcvSaveImageで画像を保存しようとすると、エラーが出てしまい保存する前にプログラムがダウンしてしまいます。 具体的には以下のとおりです。 変数 char filename[]; //出力画像の名前 char path[] = "testdir";//相対パス名(フォルダ指定用) IplImage* testimage; //生成した画像 成功例(フォルダ指定なし) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 失敗例(フォルダ指定あり) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 環境は Win XP Pro 2002 sp3 Visual C++ 2008 Express Edition OpenCV1.1 です。 どなたかご教授お願いいたします。

  • ファイルの出力先がうまく指定できません。。

    今、ファイルの出力先を変更させたいと思っていて、 調べたところ、fp=fopen("フォルダ名/test.txt","wb") のようにすればよい、というところまでは調べたのですが、 私の場合、ファイル名を、filenameというchar型の変数に入れており、 fp=fopen(filename,"wb")となってます。 これを、fp=fopen("フォルダ名/filename","wb")としてみたのですが、 これではダメでした。 ファイル名の入っている変数はそのまま使いたいのですが、 それでパス指定をする方法ありますでしょうか?

  • ファイルをドロップするとfopenからファイルが作成できません

    C言語でコンソールアプリケーションを作っています。 ファイルをexeにドロップして実行し、別のファイルに結果を出力させたいのですが、出力ファイルが作成されません。 どのようにすればよろしいのでしょうか。 コンソールから渡すときはファイルが作成されます。 コンパイラはBorland C++ Compiler 5.5を使用しています。 以下にコードの一部を掲載します。 int main(int argc, char *argv[]) {  char filename[256];  FILE *inputFile;  FILE *outputFile;  int i;  for(i=1; i<argc; i++)  {   if((inputFile=fopen(filename,"r")) == NULL)   {/*エラー処理*/}   sprintf(filename,"result%d.txt",i); // 出力ファイル名   if((outputFile=fopen(filename,"w")) == NULL)   {/*エラー処理*/}   for(;;)   {    char ss[1024];    if(fgets(ss,1024,inputFile) ==NULL) break;    fputs(ss,outputFile);   }   fclose(inputFile);   fclose(outputFile);  }  return 0; }

  • C言語でのフォルダ作成

    C言語でファイルをあるフォルダに出力する際に、フォルダがない場合、自動的にフォルダを作成するようにプログラムを組むことってできますか?

  • フォルダ参照ではなくファイルを指定したい。

    フォルダの参照ダイアログボックスを使用して ファイルを選択できるようにしています。 プログラムでcsv形式で保存し、そのcsv形式ファイルを指定して開くという動作を目的としています。 そのファイル選択を固定でなく可変で選択したいと思っています。 Dim ShellApp As Object Dim oFolder As Object Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "ファイル選択", &H4000,"C:\test") msgbox(oFolder) このような感じで、フォルダのみではなくファイルを指定することに成功しました。 しかし、このフォルダ参照ダイアログが表示されたときに、何も選択せずに キャンセルボタンをクリックするとエラーが出て止まってしまいます。 目的とする動作はできてはいるのですが、キャンセルするとエラーになるので、この原因がわからず困っています。 キャンセルボタンに関することを記述する必要があるのでしょうか? また、この他にファイルを指定するのに適した方法がありましたら教えてください。 参照するフォルダを指定しているのでパスの取得は必要ありません。 ファイルが選択できたらOKです。 フォルダのパス取得のプログラムはよくサンプルを見かけるのですが、 ファイル選択のサンプルはあまり見かけないです(-_-;) また、この方法ではC:\と絶対パスで指定していますが、exeファイルが存在する場所からの相対パスでの指定はできないのでしょうか? csvで保存する時は"./test/test.csv"などと記述して書き込みできていたのですが、 このようなパスを書くとエラーとなりファイルを見つけられないといわれてしまいます。

  • フォルダ一覧の出力

    フォルダの一覧をExcel形式、もしくはテキスト形式で出力したいと考えてます。 ファイル数が膨大なので、ファイル別の情報ではなく、フォルダ別に フォルダ名(フルパス、もしくは階層表示)とサイズを一覧で出力するフリーソフトを探してます。 贅沢言えば出力対象とするフォルダの階層まで指定できると助かります。 ファイル数が多く、ファイル一覧を出力してからサマリーすると非常に時間がかかるので、もし上記のようなフリーソフトをご存知の方がいましたら是非ご紹介願います。 よろしくお願い致します。

  • C言語でのCSVへの出力がうまくいきません…

    風力発電の発電データを1秒ごとに1日分を記録したCSVファイルを読み込み、集計して、集計用の新しいCSVファイルに書き込むプログラムを組もうとしています。以下にソースコードを記載します。 #include<stdio.h> #include<stdlib.h> static char filename[100]; static char wfname[100]; char fname2[256]; void str_copy(char[],char[]); //文字列のコピー void str_cat(char[],char[]); //文字列の連結 struct kaze { _char jikoku[16]; _double fuusoku; _double fuuko; _double denatu; _double denryoku1; _double denryoku2; _double co2; }; struct kaze data[86400]; int main() { _char date2[50]; _char date3[50]; _char month2[10]; _char year2[10]; _char path1[50]="F:\\風力発電\\風車"; _char path2[10]="年"; _char path3[10]="月\\WP"; _char buff[256]; _int month1,month,year,date; _int kensuu,i,j,uruu; _FILE *fpin,*fpout; _printf("集計する年を入力してください。\n"); _scanf("%d",&year); _printf("集計する月を入力してください。\n"); _scanf("%d",&month); _if(month==2){ __printf("閏年ですか?(はい -> 1 いいえ -> 2)"); __scanf("%d",&uruu); _} _if(month==2){ __if(uruu==1){ ___month1=29; __} __else{ ___month1=28; __} _} _else if(month==4 || month==6 || month==9 || month==11){ __month1=30; _} _else{ __month1=31; _} _date=year*100+month; _sprintf(date3,"%d",date); _str_copy(wfname,date3); _str_cat(wfname,".csv"); _sprintf(year2,"%d",year); _sprintf(month2,"%d",month); _sprintf(fname2,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,wfname); _if((fpout=fopen(fname2,"w"))==NULL){ __printf("ファイルが作成できません。 --- %s\n",fname2); __exit(EXIT_FAILURE); _} _fprintf(fpout,"日付,平均風速,平均風向,平均電圧,平均発電電力、発電電力量,CO2削減量\n"); _fprintf(fpout,"年/月/日,m/s,°,V,KW,KWh,kg-c\n"); _printf("集計用ファイルを作成しました。 --- %s\n",fname2); _fclose(fpout); _date=year*10000+month*100; _for(j=1;j<=month1;j++){ __double fuusoku=0,fuuko=0,denatu=0,denryoku1=0,denryoku2=0,co2=0; __date++; __sprintf(date2,"%d",date); __str_copy(filename,date2); __str_cat(filename,".csv"); __sprintf(buff,"%s%s%s%s%s%s",path1,year2,path2,month2,path3,filename); __if((fpin=fopen(buff,"r"))==NULL){ ___printf("ファイルが見つかりません。--- %s\n",buff); ___exit(EXIT_FAILURE); __} __for(kensuu = 0; fscanf(fpin, "%[^,],%lf,%lf,%lf,%lf,%lf,%lf\n", data[kensuu].jikoku, &data[kensuu].fuusoku, &data[kensuu].fuuko, &data[kensuu].denatu, &data[kensuu].denryoku1, &data[kensuu].denryoku2, &data[kensuu].co2) != EOF; kensuu++); __for(i = 0; i < kensuu; i++){ ___fuusoku+=data[i].fuusoku; ___fuuko+=data[i].fuuko; ___denatu+=data[i].denatu; ___denryoku1+=data[i].denryoku1; } __fuusoku/=86400; __fuuko/=86400; __denatu/=86400; __denryoku1/=86400; __denryoku2=data[kensuu-1].denryoku2; __co2=data[kensuu-1].co2; __fclose(fpin); __printf("\n%d年%d月%d日の集計結果\n平均風速:%lf(m/s)\n平均風向:%lf(°)\n __________平均電圧:%lf(V)\n",year,month,j,fuusoku,fuuko,denatu); __printf("平均発電電力:%lf(kW)\n発電電力量:%lf(kWh)\nCO2削減量:%lf(kg-c)\n" ,denryoku1,denryoku2,co2); //ここまでは正常に動作する。 ●if((fpout=fopen(fname2,"a"))==NULL){ ___printf("ファイルに追記できません。--- %s\n",fname2); ___exit(EXIT_FAILURE); __} __fprintf(fpout,"%d/%d/%d,%s,%s,%s,%s,%s,%s\n",year,month,j,fuusoku,fuuko,denatu,denryoku1 ,denryoku2,co2); __printf("以上の結果を記録しました。 --- %s",fname2); __fclose(fpout); } _return EXIT_SUCCESS; } void str_copy(char dst[],char src[]) { _int i; _for(i=0;src[i]!='\0';i++){ __dst[i]=src[i]; _} _dst[i]='\0'; } void str_cat(char dst[],char src[]) { _int i,j; _for(i=0;dst[i]!='\0';i++) ; _for(j=0;src[j]!='\0';j++,i++){ _dst[i]=src[j]; _} _dst[i]='\0'; } 集計用ファイルの作成と項目の書き込み、データファイルの読み込み、集計、ディスプレイへの表示までは問題なく動作するのですが、●印のところで変数fname2がおかしなことになっており、    ファイルに追記できません。--- 23:59:48 と表示されます。どこかでfname2が書き換えられているのだとは思いますが、実際にどこでどうなっているのか、全くわかりません。 どなたか原因がわかる方、もしくは「ここじゃないかな?」など心当たり程度でも構いません。 ご意見をお寄せください!お願いします!

  • フォルダの削除方法

    フォルダの削除エラーが出てフォルダの削除が出来ません。削除右方法を教えてください。エラー表示は下記のように出ます。 『CAKPEPXU.を削除できません。指定されたファイルが見つかりません。パスとファイル名を確認してください。』 宜しくお願いします。<(_ _)>

  • Excel VBA ファイル一覧とファイル作成日(更新日)を出力

    Excel VBA ファイル一覧とファイル作成日(更新日)を出力 はじめまして 指定したフォルダのファイル名一覧の出力方法は、msn相談箱を参考にさせていただき、 再帰法を使ったやりかたで出力することができましたが、 同時にファイルの作成日を出力する方法を教えていただけないでしょうか。 よろしくお願いします。