- ベストアンサー
ディレクトリ/ファイル リストの作成方法と共有フォルダの一覧取得について
- WindowsにおいてFindFirstFileEx()関数を用いて、ディレクトリやファイルのリストを作成する方法について説明します。
- ローカルディスクにおけるリスト作成には問題ありませんが、ネットワークパスの指定に注意が必要です。
- ネットワークパスでのリスト作成では、コンピュータ名だけを指定する形式では失敗することがあります。共有フォルダの一覧を取得する方法について解説します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>私はコンパイラをVC++ 6 を使っておりますが どうなんですかねぇ……。 一応、その頃からこのAPIは使用可能だったハズですが……。 ただ、LPTSTRがどの型になるのか?は確認された方がいいでしょう。 「マルチバイト文字セット」にした時にはNetShareEnum()の第1引数がLPWSTRではない。と怒られましたけど。<VS2005にて # 「UNICODE文字セット」である必要がある……ということになります。 # MSDNのページにあるサンプルでも「#define UNICODE」でUNICODE文字セットに設定しているので、LPTSTRはLPWSTRとなります。 LPWSTRで渡す必要があるようですのでMBCSの文字列をUNICODE文字列に変換する必要があるかも知れません。 # 実行環境がWin9Xとかならchar *なのでそのままでも問題ないハズですが……。
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
>となってしまいます。 >何が悪いのでしょうか? デバッグで追ってみると判るかと思われますが… >LPTSTR lpszServer = (LPTSTR) "\\\\kako"; // Buffer; が化けてます。 MBCSな文字列を無理矢理TSTRにキャストしますので、UNICODE版では狂ってしまいます。 LPTSTR lpszServer = _T("\\\\kako"); とするべきかと。 >while ( ret == ERROR_MORE_DATA ); セミコロンは間違い…ですよね? PSHARE_INFO_502 Buf, pt; NET_API_STATUS ret; LPTSTR lpszServer = _T("\\\\kako"); // Buffer; DWORD Num = 0 ,tr = 0,resume = 0, i; do { ret = NetShareEnum(lpszServer, 502, (LPBYTE *)&Buf, -1, &Num, &tr, &resume); if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA) { for(i = 0, pt = Buf; i < tr; i++, pt++) { OutputDebugString(pt->shi502_netname); OutputDebugString(_T("\n")); } } NetApiBufferFree(Buf); } while(ret == ERROR_MORE_DATA); ってところですかね。
お礼
添付いただいたコードをそっくりコピペして実行してみましたが現象に変わりはありません。 1.LPTSTR lpszServer = (LPTSTR) "\\\\kako"; 私の環境ではもともとデバッガ上で文字化けすることはありませんでした。 今はご指摘のとおり"_T(...)"に変更しました。 2.セミコロンは間違い…ですよね? はい。 私が例題をupする際に間違えたようです。ご指摘のとおり、";" は "{" です。 3.インフォメーションレベルを 0, 1, 2, 502, と試してみましたが変わりありません。 4.コンパイル時には lm.h 及び Netapi32.lib を使用しています。 私はコンパイラをVC++ 6 を使っておりますが、こんなものを使っているのが悪いのでしょうかね?
- Wr5
- ベストアンサー率53% (2173/4061)
>共有フォルダの一覧リストを作成するにはどうしたらよいので >しょうか? 使ったことはありませんが…NetShareEnum()でしょうかね。 http://msdn.microsoft.com/ja-jp/library/cc446966.aspx http://eternalwindows.jp/security/share/share03.html とか。
お礼
ありがとうございます。 試してみます。
補足
サンプルコードを探して、以下のコードを実行してみましたがうまくいきません。 PSHARE_INFO_502 Buf, pt; NET_API_STATUS ret; LPTSTR lpszServer = (LPTSTR) "\\\\kako"; // Buffer; DWORD Num = 0 ,tr = 0,resume = 0, i; ret = ERROR_MORE_DATA; while ( ret == ERROR_MORE_DATA ); ret = NetShareEnum ( lpszServer, 502, (LPBYTE *) &Buf, -1, &Num, &tr, &resume ); if ( ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA ) { pt = Buf; | | | | } } NetApiBufferFree ( Buf ); lpszServerに試してみたのは: \\kako \\kako\ \\kako\public \\kako\public\ などですが、いずれの場合もret値は: 53: ERROR_BAD_NETPATH(ネットワークパスが見つからない。) となってしまいます。 何が悪いのでしょうか?
お礼
Wr5様、たいへん長らくお付き合いいただいてありがとうございました。 私は今までコンパイル環境に Windows7 64bit VC++6 を使っていたのですが、同じコードを WindowsXP 32bit VC++6 環境に移したところ全く異なるエラーが発生するようになりました。 それは: ERROR_NO_UNICODE_TRANSLATION 0x00000459 です。 このエラーはMultiByteToWideChar()などのコード変換関数が出しているようなので、ご指摘のようにこの問題の原因は『文字コード』にありそうです。 ところで、私はWindowsの文字コードが全く判りません。 LPCTSTR、LPTSTR、LPSTR、LPCSTR、などといわれても、意味も使い方も全く判りません。 そこで、これを機会に少し勉強させていただき、その上で結果をご報告させていただきます。
補足
リモートマシンの文字列"\\\\kako"を明確にUnicodeに変換したところ、うまく関数を実行できるようになりました。