C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ファイルの存在確認がしたいです!(パス指定の問題?!)


(過去ログ 14 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■4840 / inTopicNo.1)  ファイルの存在確認がしたいです!(パス指定の問題?!)
  
□投稿者/ mickey (1回)-(2007/06/27(Wed) 13:23:09)

分類:[.NET 全般] 

VisualStudio2005 C#(Windowsアプリケーション)を使って開発をしています。
.NET Framework2.0です。

ローカルマシンから、ネットワークでつながったPCにあるファイルの確認をしようとしています。

PC名には例えば以下のようなIPアドレスを入れようとしています。
ソースは以下の通りです。

string PC名 = "192.168.1.1";

string file = @"\\PC名\C\c.txt";

if (File.Exists(file))
{
       batresult = " ファイルがあります";
}
else
{
       batresult = " ファイルはありません";
}


ファイルは存在するのに、ファイルがないと出ます。

ネットワークプログラミングが全くわからず、リモートPCのパスの書き方もわかりません。

合っていますでしょうか?

またリモートPCのWEBサーバ内にあるファイルの存在確認もしたいのですが、パスの指定方法がわかりません。

自分で考えてこのように書いてみたのですが、どうなのでしょうか?


string PC名 = "192.168.1.1";

string file = @"\\PC名\C:\Inetpub\wwwroot\a.txt";


インターネットなど色々検索しましたが、このような情報はあまり載っていませんでした。

どうかお力をお貸しください!

よろしくお願いいたします。

引用返信 編集キー/
■4841 / inTopicNo.2)  Re[1]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ 魔界の仮面弁士 (316回)-(2007/06/27(Wed) 13:45:01)
No4840 (mickey さん) に返信
> string file = @"\\PC名\C\c.txt";

相手側の PC に、『C』という共有名(≠ドライブ名)のディレクトリが無いか、
または、その共有ディレクトリに対するアクセス権が不足しているのでしょう。


> string PC名 = "192.168.1.1";
> string file = @"\\PC名\C:\Inetpub\wwwroot\a.txt";
変数 [PC名]が使われていませんよ。

強いて言えば、
string PC名 = "192.168.1.1";
string file = @"\\" + PC名 + @"\C$\Inetpub\wwwroot\a.txt";
ですかね。C ドライブの共有名が C$ であると仮定すれば、ですけど。
引用返信 編集キー/
■4842 / inTopicNo.3)  Re[1]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ 渋木宏明(ひどり) (245回)-(2007/06/27(Wed) 14:02:06)
渋木宏明(ひどり) さんの Web サイト
> ネットワークプログラミングが全くわからず、リモートPCのパスの書き方もわかりません。
> 合っていますでしょうか?

パスは一見あっているように見えます。

が、そもそもリモートPCで「共有」に設定していないフォルダを外部から参照することは出来ません。
その辺は理解しているでしょうか?

共有フォルダ配下のファイルを参照しようとしているのであれば、おそらくそのリモートPCに「接続」してないからファイルが見えないんでしょう。

.NET の標準ライブラリでは「接続」を直接行うことはできません。
WMI で出来るかもしれませんが、そうでなければ API を使うことになります。

> またリモートPCのWEBサーバ内にあるファイルの存在確認もしたいのですが、パスの指定方法がわかりません。
> 自分で考えてこのように書いてみたのですが、どうなのでしょうか?

前述の通りです。
リモートPC側で「共有」に設定してないフォルダを除き見ることは出来ません。

が、リモートPCで IIS が動いているのなら、IIS の管理ツール用のインターフェースを使って、IIS が管理するフォルダについては閲覧可能だったかもしれません。
けど、XP SP2 以降だと IIS 管理に使用するためのポートは外向きには閉じらていることが多いはずなので、必ず「出来る」という保証はありません。

引用返信 編集キー/
■4844 / inTopicNo.4)  Re[2]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ ちゃっぴ (40回)-(2007/06/27(Wed) 14:27:05)
ちゃっぴ さんの Web サイト
そもそも、何で確認が必要なの?

引用返信 編集キー/
■4845 / inTopicNo.5)  Re[1]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ mickey (3回)-(2007/06/27(Wed) 15:51:04)
みなさまレスありがとうございます!!

しかしまだ完成しておりません。

知識不足で大変申し訳ないのですが、さらに教えていただけませんか?


【渋木宏明(ひどり) 様】

>が、そもそもリモートPCで「共有」に設定していないフォルダを外部から参照することは出来ません。
>その辺は理解しているでしょうか?

もちろん共有に設定しています。


>共有フォルダ配下のファイルを参照しようとしているのであれば、おそらくそのリモートPCに「接続」し>てないからファイルが見えないんでしょう。

>.NET の標準ライブラリでは「接続」を直接行うことはできません。
>WMI で出来るかもしれませんが、そうでなければ API を使うことになります。


WMI接続をしようとしているのですが、書き方がわからず困っています。

他の場所で、リモートPCのドライブ容量を取得しているのでそこに処理を入れようかと思い、色々調べたのですがわかりません。

下記のような感じで書けたらなと思っていますが・・・



//WMI接続を確立する
options = new ConnectionOptions();
pcpass = "\\\\" + servername + "\\root\\cimv2";
//リモートコンピュータ上の名前空間に接続
ManagementScope scope = new ManagementScope(pcpass);
scope.Connect();
ObjectQuery query = new ObjectQuery
                 ("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3");
//上記のWQLクエリに合致するものを取得
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
//WMI を通じて管理オブジェクトを取得
ManagementObjectCollection queryCollection = searcher.Get();

foreach (ManagementObject m in queryCollection)
{
         //総容量
         long ドライブ総容量 = long.Parse("" + m["Size"]);

	//この下あたりに入れる??(ファイルの指定方法がわからず変ですが・・・)
	//Cドライブ配下の「a.txt」のファイルが存在するかどうか調べたいです。
	string file = m + @"\a.txt";
	if (File.Exists(file))
	{
       		batresult = " ファイルがあります";
	}
	else
	{
       		batresult = " ファイルはありません";
	}

}




【魔界の仮面弁士様】


>相手側の PC に、『C』という共有名(≠ドライブ名)のディレクトリが無いか、
>または、その共有ディレクトリに対するアクセス権が不足しているのでしょう。


共有名も間違えておらず、アクセス権も不足していません。

合ってるということは、こちらのネットワークの問題なのかもしれません。。。



【ちゃっぴ様】


>そもそも、何で確認が必要なの?


実はリモートPCとはサーバのことで、あるバッチジョブを実行しています。

その後正常終了であればファイルをはきだすのですが、異常終了ならばファイルははきだされません。

その確認の為にファイルの存在確認をしようとしています。



以上長々と色々書いてしまいましたがよろしくお願いいたします。

引用返信 編集キー/
■4846 / inTopicNo.6)  Re[2]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ 魔界の仮面弁士 (317回)-(2007/06/27(Wed) 16:04:08)
No4845 (mickey さん) に返信
> 共有名も間違えておらず、アクセス権も不足していません。
とありますが、少なくとも、最初に書いたような
>> string file = @"\\PC名\C:\Inetpub\wwwroot\a.txt";
のようなパスはありえませんよね。

> 合ってるということは、こちらのネットワークの問題なのかもしれません。。。
それは、一番最初に確認すべきことかも…。
確認のために、「textBox1.Text = file;」などとして、実際に使われている正確なパス文字列を得て、
そのパスを [スタート]-[ファイル名を指定して実行] に指定してみてください。

> あるバッチジョブを実行しています。
Windows のログオンユーザーと、そのアプリケーションの実行ユーザが異なるアカウントだったりはしませんか?
引用返信 編集キー/
■4847 / inTopicNo.7)  Re[2]: ファイルの存在確認がしたいです!(パス指定の問題?!)
□投稿者/ 渋木宏明(ひどり) (246回)-(2007/06/27(Wed) 16:27:02)
渋木宏明(ひどり) さんの Web サイト
2007/06/27(Wed) 17:31:55 編集(投稿者)
2007/06/27(Wed) 17:31:03 編集(投稿者)

> 下記のような感じで書けたらなと思っていますが・・・
(略)
> ObjectQuery query = new ObjectQuery
> ("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3");

Win32_LogicalDisk は、いわゆる「論理ディスク」ってヤツを扱うためのオブジェクトなんで、このオブジェクトでファイル共有に接続しようとするのは見当違いなじゃないかな。

まぁ、僕は WMI によるファイル共有への接続は試したことすら無いので、話半分に聞いてもらって構いませんが。

追記:

AddConnectionXXX() API を使ったサンプルなら、検索すればゴロゴロ見つかると思いますよ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -