C言語関係掲示板

過去ログ

No.166.カレントディレクトリの移動


No.1075

こんばんわ。はじめまして
投稿者---さと(2002/02/21 23:14:01)


 こんばんわ。はじめまして。C言語を勉強していて、どうしても、
いきずまってしまったので、早速の質問で申し訳ないのですが、
教えてください。UNIXの開発環境で、system関数を使い、
system("cd temp/") として、tempフォルダに移動したいのですが、
何も動作がおきません。また、MS-DOS環境でも、できません。
 どうか、教えていただけると、助かります。

 寒い日が続きますが、風邪をひかないようにしましょう。
では、失礼します。

No.1077

Re:こんばんわ。はじめまして(cdするには)
投稿者---kikk(2002/02/22 01:42:49)


ども。


>system("cd temp/") として、tempフォルダに移動したいのですが、
>何も動作がおきません。また、MS-DOS環境でも、できません。

system()は新規のシェルで動くので元のほうには影響がありません。
system()でcdすると、シェルを起こしてそのシェルでcdしてもとのコードに
戻るというような動作になります。なのでなにも起きないわけではないの
ですが、これは期待した動作ではないということですね。

で、どうするかというと、chdir()というのが(たぶんdir.hに)ありますので
それを使ってみてください。DOS/Win/UNIXのどれでもいけると思います。
# そういえばcdの省略しないコマンドはchdirでしたっけ

ひとつアドバイス。
本当にcdする必要があるか今一度、検討してみてください。単純にファイル
の指定のためといった場合ならパス付きで指定すればいいということもあり
ますので。


それと、関係ありませんが、この掲示板のタイトルの下に書いてある赤い字
を読むと、きっと世のため人のためになるでしょう。。


では。

> 寒い日が続きますが、風邪をひかないようにしましょう。
当方では手遅れです。

No.1081

Re:dir.hについて
投稿者---さと(2002/02/22 19:38:48)


 こんばんわ。お返事ありがとうございます。
>
>system()は新規のシェルで動くので元のほうには影響がありません。
>system()でcdすると、シェルを起こしてそのシェルでcdしてもとのコードに
>戻るというような動作になります。なのでなにも起きないわけではないの
>ですが、これは期待した動作ではないということですね。
>
>で、どうするかというと、chdir()というのが(たぶんdir.hに)ありますので
>それを使ってみてください。DOS/Win/UNIXのどれでもいけると思います。
># そういえばcdの省略しないコマンドはchdirでしたっけ
>

 仕組みがよくわかりました。親切にお返事してくださって、ありがとう
ございます。でも、実行すると、dir.h としても、sys/dir.h とやっても、
実行できません。「インクルードファイルが、みつかりませんでした」に
なってしまいます。学校でつかっているので、このヘッダファイルを
入れればできそうかなと思うのですが、いきずまってしまいました。
また、chdir関数は、dir.h 等をインクルードしなくても、実行はでき
ました。kikkさんが、教えてくださった、実行はしているけど、
元のソースコードの場所にもどってしまっているみたいなので、
思い通りの動作をしてくれません。

>ひとつアドバイス。
>本当にcdする必要があるか今一度、検討してみてください。単純にファイル
>の指定のためといった場合ならパス付きで指定すればいいということもあり
>ますので。
>
 ありがとうございます。
 しかし、移動がしたいのです。なぜかというと、編集したいファイルが、
たくさんあるので、移動してから、色々処理をしていきたいのです。
そこで、入力するのに、cd httm/profile/friend などと、たくさん
入力するより、プログラムで、profirend などの実行ファイルをつく
っておいて、入力する文字の数を少なくしたいのです。

>
>それと、関係ありませんが、この掲示板のタイトルの下に書いてある赤い字
>を読むと、きっと世のため人のためになるでしょう。。
>

 ご指摘、ありがとうございます。赤字であるのにもかかわらず、
見落としてしまいました。ごめんなさい。以後は、気をつけます。

>> 寒い日が続きますが、風邪をひかないようにしましょう。
>当方では手遅れです。

 夜、寝る時は、体をあたたかくして、早くなおしてくださいね。
まだ、まだ寒い日が続いてますからね。では、失礼します。

No.1085

Re:dir.hについて
投稿者---kikk(2002/02/23 02:08:01)


ども。


>ございます。でも、実行すると、dir.h としても、sys/dir.h とやっても、
>実行できません。「インクルードファイルが、みつかりませんでした」に
>なってしまいます。学校でつかっているので、このヘッダファイルを
>入れればできそうかなと思うのですが、いきずまってしまいました。
>また、chdir関数は、dir.h 等をインクルードしなくても、実行はでき
>ました。kikkさんが、教えてくださった、実行はしているけど、
>元のソースコードの場所にもどってしまっているみたいなので、
>思い通りの動作をしてくれません。

手元にUNIXがないのでGoogleで「chdir() UNIX」で検索したところ、dir.h
ではなくunistd.hにあるようです。なお、わずかな例外をのぞいて、ヘッダ
ファイルはそのシンボルを使うことをコンパイラに宣言するだけであって、
その本体(実体)の存在までは保証しないので、ヘッダファイルをどこかから
入手したからといってどうなるものでもありません。リンカは、リンク時に
正しい本体がなかった場合は、たいていエラーを出してだして実行ファイル
生成を中止するか、適当なのをさがしてリンクするようですが、後者の場合
本当に適切なものがリンクされたのかはわからないし(だいたいの場合は
うまくいっている「ように見えます」けど)、プロトタイプなしで呼び出して
いるため、引数の型変換まわりでおかしなことがおこるかもしれません。

関数名がわかっていて、そのヘッダを調べたいときはUNIXならオンライン
マニュアルで調べられます(man chdirというような感じで)。たいていは
これでいくのですが、それでだめならincludeディレクトリの*.hをgrepか
なにかで直接さがしてみてください(なかったらその中のサブディレクトリ
も)。includeディレクトリは多分/usr/includeあたり。なかったら
which stdio.h等して、表示されたディレクトリ。それでもみつからない
場合は、Webを検索してみてください(もっとも、最初のオンライン
マニュアルでみつからなかったら望みは薄いですけど)。それでもダメな
ときは、その情報元の環境と自分の環境の照らし合わせをしたあと、
(念のため)最初からリトライするか、別の方法を探すか、あきらめるか
してください。

DOS/Winの場合も同じく、ライブラリリファレンス -> includeディレクトリ
-> ...の順に探してみてください。DOS/Winの場合は標準ではgrepは使え
ませんので、同等のfindを使ってください。なお、BCBをインストールする
と、grepもインストールされるようです(grepはベクター等にもあります)。


今回の範囲では大丈夫かと思って、WinとかUNIXという言葉をつい使って
しまいましたが、OSとコンパイラは明確にしておいたほうがよかったです
ね(お互い)。ちなみに、BCB4ではdir.hは存在して、宣言もそこに書いて
ありました(direct.hはdir.hをインクルードしていました)。


いいわすれましたが、chdir()は非標準関数です。インクルードするファイル
がなかったり違ったりで気づいたかもしれませんね。


では。

No.1089

Re:dir.hについて
投稿者---さと(2002/02/23 22:53:18)


 こんばんわ。ご親切に、どうもありがとうございます。
ご指摘のとおり、unistd.h は、うまくインクルードしてくてたのですが、
動作が、思い通りになりません。

 コンパイラは、ccを使っています。OSは、SUNOS5.8 みたいです。
Tera Term Proをつかって、いろいろ操作をしています。

#include <unistd.h>

void main(void){

chdir("./temp");

}

ソースは、このようにしているのですが、ディレクトリの移動を
してくれません。何か、致命的な失敗をしてるのでしょうか?
chdir("temp") でも、chdir("~/temp")でも、無理でした。思い浮かぶ
ことは、ためしてみたのですが、いきずまってしました。また、
googleで検索してみましたが、具体的につかっている例がなく、
自分の力では、解決できません。

 色々おしえてくださって、本当にありがとうございます。
では、失礼します。

No.1082

Re:windowsのほうは、解決しました
投稿者---さと(2002/02/22 20:05:13)


 kikkさんのおかげで、windowsのほうは、#include <direct.h>
と、_chdir関数をつかって、うまくいきました。どうもありが
とうございました。では、失礼します。


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.16
Copyright(c) 2000-2002 TOMOJI All Rights Reserved