こんにちは。

VC++を使用してWindows上で動作するプログラムを作成しているのですが、ユーザに絶対パスをテキストで入力させ、そのパスが存在しなければ、フォルダとファイルを新規作成するかどうか問い合わせるという処理を行いたいと考えています。

 そこで質問なのですが、
・有効なパス設定で存在しないフォルダ
・無効なパス

上記を判定したいのですが、現状区別が付けられないでいます。実際には、以下のように処理しています。
OutputFilename:CString型、絶対パス(ファイル名含む)が入っている。
OutputPath:CString型、絶対パス(上記から「\ファイル名」を除いたもの)

// 出力ファイルのパス存在チェック
pathlen = OutputFilename.ReverseFind('\x5c');// 最後の\記号までの文字数を取得
if(pathlen == -1)
return -1; // エラー
OutputPath = OutputFilename.GetBufferSetLength(pathlen);
nRcd = _chdir(OutputPath);
if(nRcd){
if(errno == ENOENT)
return -1; ※
}

※無効なパス(例えばabc\bcd\efgなど)であっても、存在しないパス(例えばC:\tempは存在し、その配下には存在しないフォルダ名を指定-C:\temp\abc\def)であっても、同様に_chdir関数が失敗し、errnoにENOENTが入るようです。

どなたかご存知の方がおられましたら、どうかご教授お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Win32 API BOOL PathIsDirectory(LPCTSTR Path);



-------------
char *Path = "c:\\windows\\";

if (PathIsDirectory(Path)) printf("'%s'は正しいディレクトリである。\n", Path1);
else printf("'%s'は正しいディレクトリでない。\n", Path);
--------------
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼が遅くなり、申し訳ありません。

結局、GetDriveTypeと実際に作成を試みて成功するかどうかで判定することにしました。

どうもありがとうございました。

お礼日時:2005/04/25 14:20

色々な方法があると思いますが、他の方も言われているように実際にアクセスしてみるのが堅実だと思います。

他には、軽くFind系で探してみる手もあります。

それから問い合わせするのであれば、うるさいユーザーの為にも書き込み不可能なCD-ROMやネッワークパスを入力された場合、マヌケなメッセージを出さないような配慮も必要ですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼が遅くなり、申し訳ありません。

結局、GetDriveTypeと実際に作成を試みて成功するかどうかで判定することにしました。

どうもありがとうございました。

お礼日時:2005/04/25 14:17

::GetFileAttribute()を使って


そこにファイルがあるかディレクトリがあるか
あるいは存在しないかを調べるとよいでしょう。

パスの有効性を調べるには
とりあえず::CreateFileしてみるのでは駄目ですか?

あと
OutputFilename.ReverseFind('\x5c'); は危険かも
最後のパスが漢字だったりする場合に
あやまって検出する可能性があります。

移「0x835C」にひっかかったり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼が遅くなり、申し訳ありません。

結局、GetDriveTypeと実際に作成を試みて成功するかどうかで判定することにしました。

どうもありがとうございました。

お礼日時:2005/04/25 14:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「古い圧縮ファイル」の確認方法

Dドライブのディスクのクリーンアップをしたいのですが、実行できるものが、「古い圧縮ファイル」の削除しかありません。

「古い圧縮ファイル」がどのプログラムかを確認する方法を教えてください。

また、圧縮されたファイルの名前は青くなるらしいのですが、見つかりません。どうしてでしょうか
圧縮ファイルは1G弱あります。

Aベストアンサー

http://www.atmarkit.co.jp/fwin2k/win2ktips/106cleanup/106cleanup.html

初期設定では、50日以上アクセスの無かったファイルに対して、圧縮が行われます。
当然、圧縮してからでないと、ファイル名は青色にはなりませんので、ディスク・クリーンアップでの候補段階では、黒色のままです。


尚、設定によっては青色表示にならない場合も有りますけど。

http://121ware.com/qasearch/1007/app/nec.jsp?005084

Qif ( fp == NULL ){ を if ( fp == 0){ へ変更した場合

http://oshiete.goo.ne.jp/qa/8897349.html
 ですが
if ( fp == NULL ){ を
if ( fp == 0){
 fopen dekina と表示してくれるのでしょうか?
  試す環境がございませんので
 よろしくお願いいたします。

Aベストアンサー

>if ( fp == 0){
> fopen dekina と表示してくれるのでしょうか?

はい、表示してくれます。
NULLは、通常、(void*)0 の値が定義されていますので、実体は0と同じです。
しかし、NULLはポインターに対して定義されているのなので、
if ( fp == NULL) と書いたほうがよいでしょう。
一方、0は数値を表すので、
if (fp == 0)とは、書かないほうがよいでしょう。
int a;
が定義されていたとき、
if (a ==0) は、a(という数値を表す変数)の値が0か否かを判断するので、これでよいですが
if ( a== NULL) は、a(という数値を表す変数)の値がNULLか否かを判断するので、
違和感がありますから、使用しないほうが良いでしょう。

Qファイルの圧縮方法

AVIやMPGの画像ファイルを圧縮する方法を教えてください。900mb位のファイルをCD-Rに落とし込める700mbまで圧縮したいんですが。できれば、zipやlzhなどの後で解凍しなくてはいけないような圧縮方法ではなく、多少画像が荒くなってもファイルを単純に縮小させるような方法を教えていただけると有り難いのですが。。
因みに、TMPGEncを試してみたんですが、どうもうまくいかなくて。。ファイルサイズが元のファイルより逆に大きくなってしまうんです。
すいませんが、宜しくお願いします。

Aベストアンサー

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450 450 くらいでカット。
対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331
ではでは!

追伸
カンタンにならrmファイルに変更かなあ
でも画質は落ちますよ
ネット配信 ストリーミング形式でどぞ!
RealplusG2とかRealEncoderで変換
でもaviでもないしmpegでもないですけど、どお?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450...続きを読む

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.

Qファイルの圧縮方法が解りません

窓の杜やベクター等に置かれている、フリーの圧縮、解凍ソフトをダウンロードしていますが、テキストファイルや、画像ファイルの圧縮方法が解りません。何方か教えて頂けませんか?

Aベストアンサー

ソフトの開発者のサイトで質問することをお奨めします。

ソフトごとに操作方法が異なりますので、使用しているソフト名すらない状態では誰も必要とする回答を出せません。

窓の杜やベクターでは開発者のサイトへのリンクがありますから、そこからアクセスできますよ。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qpsdファイルの圧縮方法

psdファイルの圧縮方法を教えてください。(基本的質問で恐縮ですが)
win98です。なお、ファイルは9MB程度ですが、圧縮したものを解凍する際、鮮明度が落ちずに元通りの画像で開けますでしょうか?

Aベストアンサー

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (デフォルトでは 1.2MB を上限として分割される。)
   (このサイズは +Lhaca で変更できる。)
 5. (4)のファイル全てを、容量を超えないようにメールに添付して送信
   する。
   (添付ファイル総数を本文に明記すること。)
 6. 受け取った側は、全ての添付ファイルを一箇所に集めて、バッチファ
   イルを実行する。
   (操作手順は、本文に明記すること。)
 7. 分割されたファイルが結合されるので、結合された圧縮ファイルを解
   凍する。
 8. 9MBのファイルが解凍されるので、作業する。


これでどうかな!?

※他の圧縮ソフトも分割機能が備わっていると思うが・・・

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (...続きを読む

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QNTFS圧縮したファイルを全部まとめて戻す方法

NTFS圧縮したファイルをプロパティからひとつひとつチェックをはずして戻すのではなく、圧縮されたファイルを全部まとめて元に戻す方法ってあるのでしょうか?

Aベストアンサー

圧縮を解除したいファイルを全て選択した状態で
→プロパティ→NTFS圧縮のチェックを外す→OK

それらのファイルがフォルダに入っているなら
フォルダのプロパティからやってもいい。
(サブフォルダにも適用するか尋ねられるからOKにする)

Qc:\Winodows\Sendotoとc:\Windows\デスクトップについて

設定によってはシステムをc:\Winodowsからc:\winにできるから
c:\Winodows\Sendotoとc:\Windows\デスクトップを
c:\win\Sendotoとc:\win\デスクトップにできます

同じように"Sendoto"と"デスクトップ"を例えば"Send"と"desktop"のように他の名前にできるのでしょうか?
できたとするとどのように命名されているかはどこを見れば良いのでしょうか?

Sendotoのファイル等はデスクトップ上の右クリックメニューの送るに表示され
デスクトップのファイル等は起動後に真っ先に現れる画面に表示されますね

よろしくお願いします

Aベストアンサー

SHGetSpecialFolderLocationを使ってください。

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=235894


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング