ネットワークのパスを正確に取得するには?

解決


FOW  2007-06-23 02:09:07  No: 136789

初めまして。
どうにも行き詰ったので質問させてください。
現在下記の構文をしているのですが

    Dim Fofso As FileSystemObject
    Set Fofso = New FileSystemObject
    Dim Fofolder As Folder
 → Set Fofolder = Fofso.GetFolder("C:\work")

4行目の「Fofso.GetFolder("C:\work")」のように引数を自分のHDD指定を
すれば「Fofolder」にパスがそのまま"C:\work"と入るのですが
ネットワークを介してFofso.GetFolder("\\Takada\work")とすると
「Fofolder」のパスが「"\\takada\work"」と先頭の\\の次の「T」が「t」になってしまうのですがこれはそういうものなのでしょうか?
  それとも、単純に使い方が分かってないだけなのでしょうか
先頭一文字が変わらない方法があるならば教えてください。
よろしくお願いいたします。


FOW  2007-06-23 02:11:53  No: 136790

すいません環境は
VB6.0  OSはXPProです


さくら  2007-06-23 06:37:39  No: 136791

で、実際は接続できるのでしょうか?
それともできないのでしょうか?


FOW  2007-06-25 17:58:04  No: 136792

さくらさんレスありがとうございます。
すいませんでした、環境説明不足でした。
ネットワークには接続できている状態です。
ローカルフォルダを共有設定してネットワークから共有フォルダにアクセス
し、そのパスを取得すると「\\Takada\work」が「\\takada\work」と
なってしまうのです。


ななし  2007-06-25 18:40:10  No: 136793

問題点は?


FOW  2007-06-25 22:29:50  No: 136794

ななしさんレスありがとうございます。
問題点は

指定したフォルダ内にある、指定した拡張子を持つファイルを削除する
というプログラムを書いたのですが
ローカルディスクでは問題なく削除できるのですが
ネットワーク上の共有フォルダを指定すると
「"その拡張子を持つファイルはありません"」(これはOn Error Resume Nextで処理しています)となりファイルの削除が実行されないという問題が起きています。
  なので原因を考えてみたところネットワークのパスが
「\\Takada\work」が「\\takada\work」となっているのが怪しいと思ったのですが・・・。
ソースを載せたほうが宜しいでしょうか?


魔界の仮面弁士  2007-06-25 23:11:42  No: 136795

> On Error Resume Nextで処理しています
そのときの Err.Number は何でしたか?

> その拡張子を持つファイルはありません
それって、Err.Description ではなく、独自のメッセージですよね。

> ファイルの削除が実行されないという
アプリの実行ユーザーが、その共有ディレクトリ内のファイルに対する
削除権限を有していない、ということなのでは。
(あるいは、そもそも共有ディレクトリ内の読取権限を有していないとか)

> 怪しいと思ったのですが・・・。
ホスト名の大文字・小文字は、区別されない仕様だったかと思いますが…。

# まぁ、(lmhosts などのように)大文字小文字が区別されるケースもあるけれど、
# その場合は基本的に、「すべて大文字」か「すべて小文字」となるので、
# むしろ「Takada」のように、「先頭だけ大文字」の方が異端かも。


FOW  2007-06-26 01:51:39  No: 136796

魔界の仮面弁士さんレスありがとうございます。
>そのときの Err.Number は何でしたか?
ナンバー53がでました

>それって、Err.Description ではなく、独自のメッセージですよね。
はい。これは自分でmsgboxで表示させているものです。

>アプリの実行ユーザーが、その共有ディレクトリ内のファイルに対する
>削除権限を有していない、ということなのでは。
>(あるいは、そもそも共有ディレクトリ内の読取権限を有していないとか)
これはフォルダのプロパティで設定する項目ですよね?

>ホスト名の大文字・小文字は、区別されない仕様だったかと思いますが…。
なるほどありがとうございます。(実は自分の中で一番重要な項目でした

あ、あと便乗質問ですいませんがフォルダに漢字が含まれていると

「\\Takada\基本」が「\\takada\?.」となってしまうのですが
これはパス指定の仕方がおかしいのでしょうか?
すいませんがよろしくおねがいします。


魔界の仮面弁士  2007-06-26 02:41:03  No: 136797

>>そのときの Err.Number は何でしたか?
>ナンバー53がでました
『ファイルが見つかりません。』というやつですね。

> これはフォルダのプロパティで設定する項目ですよね?
フォルダの共有権限というと、NTFS の設定と、共有設定の 2 つがありますよね。
それから、ドメインを組んでいるか、ワークグループなのかによっても
必要な設定方法は変わってきますし。

とりあえずは、
  (1) エクスプローラ上での削除が行えるのか?
    →削除できないなら、プログラム以前の問題。(環境設定を見直すべき)
  (2) 削除する処理は、具体的にどのようなコードなのか?
  (3) 削除対象のファイルの属性は? (読取専用属性の有無とか)
などを調査してみてください。

> 「\\Takada\基本」が「\\takada\?.」となってしまうのですが
こちらでも再現しました。scrrun.dll ver 5.6.0.8820 です。

もしそれが問題になるようであれば、Microsoft のサポートに、
hotFix の修正プログラムが提供されているかどうか、
問い合わせてみては如何でしょう。


FOW  2007-06-26 03:13:55  No: 136798

魔界の仮面弁士さん度々ありがとうございます。

>フォルダの共有権限というと、NTFS の設定と、共有設定の 2 つがあります
>よね。
>それから、ドメインを組んでいるか、ワークグループなのかによっても
>必要な設定方法は変わってきますし。
今はドメインを組んでいます

>  (1) エクスプローラ上での削除が行えるのか?
>    →削除できないなら、プログラム以前の問題。(環境設定を見直すべき)
これは単純にエクスプローラのローカルドライブ上でフォルダを選択してデリートで消えるかってことですよね?

>  (2) 削除する処理は、具体的にどのようなコードなのか?
これは僕が書いたコードを載せればいいのでしょうか?

>  (3) 削除対象のファイルの属性は? (読取専用属性の有無とか)
ファイルの属性は何も付いてませんが、フォルダが読み取り専用に
なっていて解除が出来ない状態なのです・・・。

>こちらでも再現しました。scrrun.dll ver 5.6.0.8820 です。
これはscrrun.dllのver 5.6.0.8820というファイルを入れれば良いのですか?
で、いれてみてそれでも問題があるなら

>Microsoft のサポートに、hotFix の修正プログラムが提供されているかどう>か、問い合わせてみては如何でしょう。
という解釈でよろしいのでしょうか?

長文及び質問ばかりになってしまい申しわけありませんが
よろしくお願いします。


魔界の仮面弁士  2007-06-26 04:27:29  No: 136799

> これは単純にエクスプローラのローカルドライブ上でフォルダを選択してデリートで消えるかってことですよね?
や、違います。

そもそも、今回消そうとしているのは「フォルダ」ではなく、
「指定した拡張子を持つファイル」なのですよね?
であれば、選択するべきはフォルダではなく、「ファイル」でしょう。

それに、今回処理対象となっているのは、ローカルドライブ上のファイルではなく、
ネットワーク共有フォルダ(\\takada\work)上のファイルであったはずです。
ローカルで検証しても無意味かと。

> これは僕が書いたコードを載せればいいのでしょうか?
ですます。ファイルやフォルダの削除方法にも、いろいろありますしね。

DeleteFile メソッド / DeleteFolder メソッドとか、
Kill ステートメント / RmDir ステートメントとか、
File/Folder オブジェクトの Delete メソッドとか。

> ファイルの属性は何も付いてませんが、
アーカイブ属性ぐらいはついている気もしますが、
とりあえず、ファイルの属性については問題なさそうですね。

問題になるとすれば、ファイルに対する権限が
どのようになっているか、ですね。

> フォルダが読み取り専用に
エクスプローラ(の詳細モード)で、ヘッダを右クリックして、[属性]を
有効にしたときに、そのフォルダが R と表示される、という状況でしょうか?

読取専用フォルダとは珍しいですが、読取専用であったところで、
フォルダ名を変更したり、配下のファイルやフォルダを作成/削除
できなくなったりするわけでは無いのですけれどね。

> なっていて解除が出来ない状態なのです・・・。
XP 等では、フォルダ右クリックの「プロパティ」からでは、
読取専用属性を確認/変更するこができないので、コマンドプロンプトから、
下記のコマンドを叩いてみてください。
    ATTRIB C:\folderName    …… 現在の属性を確認
    ATTRIB -R C:\folderName    …… 読取専用属性を解除
    ATTRIB /?     …… ATTRIB コマンドのヘルプ

>>こちらでも再現しました。scrrun.dll ver 5.6.0.8820 です。
FileSystemObject の実態が、scrrun.dll というファイルに在る事はご存知ですよね。

> これはscrrun.dllのver 5.6.0.8820というファイルを入れれば良いのですか?
解決策ではなく、当方バージョン 5.6.0.8820 という環境において、
FOWさん同様、共有名「基本」が「?.」に化ける現象が発生した、という報告です。

> という解釈でよろしいのでしょうか?
「?.」化けの件は、おそらくは FileSystemObject または OS 側の不具合で
ある可能性が高そうなので、Microsoft のサポートに問い合わせた方が、
確実であろう、という意味です。

もちろん、(MSDN インシデントなどの)サポート契約を結んでいる事が
前提ですが、バグの場合は、インシデントは消費されませんし、
問い合わせた結果、hotfix があれば提供してもらえるかも知れませんし、
hotfix が無い場合でも、対応策を教えてもらうことはできるでしょう。


FOW  2007-06-26 19:38:34  No: 136800

魔界の仮面弁士さん返信遅くなりました
レスありがとうございます。

ネットワーク上からではファイルを削除することは出来ませんでした。
これはファイルアクセスに対する権限が無いということでしょうか?
…どうやらファイルの権限をもっと勉強すべきだということが解りました。

ATTRIB  c:\work
        C:\work
となり属性が無いことを確認しました。

>FileSystemObject の実態が、scrrun.dll というファイルに在る事はご存知ですよね。
すいません。
これは初めて知りました・・・・。

>ですます。ファイルやフォルダの削除方法にも、いろいろありますしね
コードです。書き方がでたらめで見にくいと思いますが
他のコントロールとの関係もあるかも(?)知れないと思ったので全て載せます。

Option Explicit
'
Private hFile As File
' 関数の宣言
Private Declare Function SHBrowseForFolder Lib "shell32.dll" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

' 構造体の定義
Private Type BrowseInfo
    hWndOwner As Long
    pIDLRoot As Long
    pszDisplayName As Long
    lpszTitle As Long
    ulFlags  As Long
    lpfnCallback As Long
    lParam As Long
    iImage As Long
End Type

' フォルダ以外(マイコンピュータなど)は選択できないようにする
Private Const BIF_RETURNONLYFSDIRS = 1
' ネットワークドライブの選択をできないようにする
Private Const BIF_DONTGOBELOWDOMAIN = 2

Private Const MAX_PATH As Long = 512

'ファイル削除ボタン
Private Sub Command1_Click()

On Error GoTo Err1
If Text1.Text = "" Then
    Resume
End If

'ファイルパス
Dim re_sbuffer As String

'カウンタ
Dim i As Integer

'拡張子を取得
Dim kakuc As String
Dim kakuhyou As String

'あえてファイルからパスを読む
'ボタンを2つ使って機能を分散させている弊害
'拡張子表示と削除
'なにかよさげな方法がありそう・・・
Open "C:\tmp.txt" For Input As #1
Input #1, re_sbuffer
Close #1

'FileSystemObject (FSO) の新しいインスタンスを生成する
Dim hFso As FileSystemObject
Set hFso = New FileSystemObject

On Error Resume Next
'Folder オブジェクトを取得する
Dim hFolder As Folder
Set hFolder = hFso.GetFolder(re_sbuffer)

    kakuc = Text1.Text
    
    '指定した拡張子があるかどうか
    For Each hFile In hFolder.Files
        If Right(hFile.Path, 3) = kakuc Then
            i = i + 1
        End If
    Next hFile

    On Error GoTo Err2
    If i = 0 Then
        Resume
    Else
        Dim fil_ki As FileSystemObject
        Set fil_ki = New FileSystemObject
        ' 読み取り専用ファイルの場合でも削除する
        Call fil_ki.DeleteFile("c:\tmp.txt", True)
        ' 不要になった時点で参照を解放する
        Set fil_ki = Nothing
        i = 0
        MsgBox "指定した拡張子を持つファイルを削除します", vbOKOnly, "削除"
        '入力された拡張子を持つファイルを削除する
        For Each hFile In hFolder.Files
            If Right(hFile.Path, 3) = kakuc Then
                hFso.DeleteFile (hFile.Path)
                i = i + 1
            End If
        Next hFile
        Text1.Text = ""
    End If

    '不要になった時点で参照を解放する
    Set hFolder = Nothing
    Set hFile = Nothing
    Set hFso = Nothing

    Text2.Text = "拡張子【" & kakuc & "】の" & vbCrLf
    Text2.Text = Text2.Text & "ファイルを消しました" & vbCrLf
    Text2.Text = Text2.Text & i & "件ありました" & vbCrLf
    Exit Sub
Err1:
    MsgBox "拡張子を入力してください", vbOKCancel, "入浴えらー"
Err2:
    MsgBox "その拡張子を持つファイルはありません", vbOKOnly, "無し"
    Text1.Text = ""
End Sub

'テキストボックスクリア
Private Sub Command2_Click()
    Text1.Text = ""
    Text2.Text = ""
    Label1.Caption = "←拡張子を入力してください"
End Sub
'拡張子選択ボタン
Private Sub Command3_Click()
Dim lpIDList As Long
Dim sbuffer As String
Dim szTitle As String
Dim tBrowseInfo As BrowseInfo

szTitle = "フォルダを選択してください" '表示する文字列をここに代入

    With tBrowseInfo
        .hWndOwner = Me.hWnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS ' + BIF_DONTGOBELOWDOMAIN
    End With

    lpIDList = SHBrowseForFolder(tBrowseInfo)

    If (lpIDList) Then
        sbuffer = Space(MAX_PATH)
        SHGetPathFromIDList lpIDList, sbuffer
        sbuffer = Left(sbuffer, InStr(sbuffer, vbNullChar) - 1)
        Label1.Caption = sbuffer
    Else
        Text2.Text = ""
    End If
    
Dim i As Integer            'ループカウンタ1
Dim j As Integer            'ループカウンタ2
Dim k As Integer            'ループカウンタ3
Dim m As Integer            'ループカウンタ4
Dim n As Integer            '拡張子の種類の総数
Dim kaku_syu() As String    '拡張子の種類配列格納
Dim total_con() As String   '拡張子格納
Dim to_work As String       'ソート領域

'FileSystemObject (FSO) の新しいインスタンスを生成する
Dim hFso As FileSystemObject
Set hFso = New FileSystemObject

On Error Resume Next
'Folder オブジェクトを取得する
Dim hFolder As Folder
Set hFolder = hFso.GetFolder(sbuffer)

    'ファイル数検出
    i = 0
    For Each hFile In hFolder.Files
        i = i + 1
    Next hFile
    
    On Error GoTo Err3
    If i = 0 Then
        Resume
    Else
        j = i
        k = j
        i = 1
    
        ReDim total_con(j)

        '拡張子を摘出して配列に格納
        For Each hFile In hFolder.Files
            total_con(i) = hFso.GetExtensionName(hFile.Path)
            i = i + 1
        Next hFile

        '昇順にソートする
        For i = 1 To k - 1
            For j = i + 1 To k
                If total_con(i) > total_con(j) Then
                    to_work = total_con(i)
                    total_con(i) = total_con(j)
                    total_con(j) = to_work
                End If
            Next j
        Next i
        
        '種類をカウント
        n = 1
        For i = 1 To k - 1
            j = i + 1
            If total_con(i) = total_con(j) Then
            Else
                n = n + 1
            End If
        Next i
        m = n
        
        '種類別に振り分け
        ReDim kaku_syu(n)
        n = 1
        For i = 1 To k - 1
            j = i + 1
            kaku_syu(n) = total_con(i)
            If total_con(i) = total_con(j) Then
            Else
                kaku_syu(n) = total_con(i)
                n = n + 1
            End If
        Next i
        kaku_syu(n) = total_con(i)

        '中身表示
        If Text2.Text = "" Then
            Text2.Text = Text2.Text & "このフォルダには" & vbCrLf
            Text2.Text = Text2.Text & m & "種類の拡張子があります" & vbCrLf
            Text2.Text = Text2.Text & "拡張子一覧" & vbCrLf
            For m = 1 To n
                Text2.Text = Text2.Text & kaku_syu(m) & vbCrLf
            Next
        Else
            Text2.Text = ""
            Text2.Text = Text2.Text & "このフォルダには" & vbCrLf
            Text2.Text = Text2.Text & m & "種類の拡張子があります" & vbCrLf
            Text2.Text = Text2.Text & "拡張子一覧" & vbCrLf
            For m = 1 To n
                Text2.Text = Text2.Text & kaku_syu(m) & vbCrLf
            Next
        End If
    End If
    
    'あえてパスをファイルに書く
    'だって・・・別のプロシージャに渡す方法を知らんのだもん
    Open "C:\tmp.txt" For Output As #1
    Write #1, sbuffer
    Close #1
    Exit Sub
Err3:
    MsgBox "このフォルダにはファイルはありません", vbOKOnly, "ファイルなし"
End Sub
Private Sub Command4_Click()
    End
End Sub

Private Sub Form_Load()
'戻り値
Dim j As Integer

    MsgBox "このプログラムはファイルを削除します", vbCritical, "Danger!!"
    MsgBox "削除したファイルは二度と戻りません", vbCritical, "Danger!!"
    j = MsgBox("注意してください", vbOKCancel, "Danger!!")
    
    If j = 2 Then
        End
    End If
    Label1.Caption = "←拡張子を入力してください"
End Sub

これで全部です。モジュールとかは書いてません。
それと、もしよろしければ「ここが変」とか「ここは違う」などの
指摘をして頂けると非常に助かります。
よろしくお願いします。


魔界の仮面弁士  2007-06-26 22:16:54  No: 136801

# 最初の質問からは、随分離れてしまったなぁ…。(^^;

> ネットワーク上からではファイルを削除することは出来ませんでした。
では、プログラムの問題ではなく、環境の問題ですね。
ネットワーク管理者の方に相談してみてください。

> これはファイルアクセスに対する権限が無いということでしょうか?
> …どうやらファイルの権限をもっと勉強すべきだということが解りました。
1. まず、"takada"サーバに、管理者権限でログオンしてください。
2. 次に、公開対象のフォルダのプロパティから、[セキュリティ]タブを開きます。
  (OSによっては、セキュリティタブが非表示に設定されている場合もあります)
3. [追加]ボタンを押して、クライアントPCのログオンユーザ(またはそのグループ)を追加し、
  必要な権限を与えてください。なお、ここで指定するのは、takadaサーバにとっての
  アカウントではなく、ドメインのアカウントであることに注意してください。

>>FileSystemObject の実態が、scrrun.dll というファイルに在る事はご存知ですよね。
>すいません。
>これは初めて知りました・・・・。
「参照設定」や「オブジェクト ブラウザ」にて+、ファイル名を確認できますよ。

> それと、もしよろしければ「ここが変」とか「ここは違う」などの
> 指摘をして頂けると非常に助かります。
了解です。
ではまず、宣言部〜 Command1 の処理までを。

----------------------------------------------------
☆宣言部☆

> Private Const BIF_DONTGOBELOWDOMAIN = 2
> Private Const MAX_PATH As Long = 512
後者は As Long が指定されているのに、前者は規定の型(初期設定のままなら Variant)に
なっていますね。常に As 句を指定する癖をつけた方が良いですよ。

> Private Type BrowseInfo
間違いではありませんが、一般的には、この構造体(ユーザー定義型)の名前は
  Private Type BROWSEINFO
と記述されますね。(VB は大文字小文字を区別しませんが、C/C++系の言語では区別されます)

----------------------------------------------------
☆Command1(ファイル削除ボタン)☆

>   On Error GoTo Err1
>   If Text1.Text = "" Then
>     Resume
>   End If
この部分が間違っています。
正しくは Resume ステートメントではなく、Err.Raise メソッドでしょう。

もしくは、もっと単純に、
  If Text1.Text = "" Then
    MsgBox "拡張子を入力してください", vbOKCancel, "入力エラー" '"入浴えらー"
    Exit Sub
  End If
とすべきかと思います。

提示されたコードでは、Resume の実行によって、Err1 ラベルに飛んでいますが、
それは、Resume ステートメントの実行によって、
  Err.Number = 20
  『エラーが発生していないときに Resume を実行することはできません。』
という実行時エラーが発生してしまっているだけであり、正しい使い方ではありません。

Resume (再開)は、その名の通り「先ほどエラーになった行を再度実行する」
「先ほどエラーになった行を飛ばして、その次の行から続行する」などのように、
『エラーからの回復』のために使われるものです。

> 'あえてファイルからパスを読む
> 'ボタンを2つ使って機能を分散させている弊害
> '拡張子表示と削除
> 'なにかよさげな方法がありそう・・・
選択した拡張子一覧を ListBox に表示しておき、
そこから選ばせるようにしてみては如何でしょう?

> On Error Resume Next
> 'Folder オブジェクトを取得する
エラー発生時に対するリカバリー処理が抜けています。
むやみにエラーを握りつぶすことは避けましょう。

この場合は、Err.Number をチェックするか、または Folder オブジェクトが
取得できたかどうかを確認し、取得できなかった場合に備える必要があるでしょう。

> If Right(hFile.Path, 3) = kakuc Then
拡張子は 3 文字であるとは限りません。.html/.jpeg のように 3 文字を超えるものや、
.js / .h のように 3文字未満のものや、中には「拡張子なし」というファイルもあります。

この場合は、Right 関数を使うよりも、FileSystemObject の GetExtensionName メソッドを
使った方が楽でしょう。

それと…Windows ではファイル名の大文字小文字が区別されませんので、拡張子判定では、
"txt" と "TXT" と "Txt" を同一視しなければならない点も考慮しないといけませんね。

>   i = i + 1
      :
> If i = 0 Then

「i」のような一文字変数は、避けた方が良いでしょう。わかりやすい名前をつけましょう。
たとえば今回の場合は、ファイルの有無をチェックするための変数のようですので、
  Dim found As Boolean  'ファイルの有無をチェックする
  found = False

  For Each ……
    If …… Then
      found = True
      Exit For
    End If
  Next

  If Not Found Then
    MsgBox "その拡張子を持つファイルはありません", vbOKOnly, "無し"
    Exit Sub
  End If
のようなコードの方が、プログラムの意図を読み取りやすいですよね。

一方、後半の「i」については、削除したファイル数を表すようですので、
  Dim deletedCount As Integer
などにした方が、意図を表せるかと思いますよ。

> Set fil_ki = New FileSystemObject
> ' 読み取り専用ファイルの場合でも削除する
> Call fil_ki.DeleteFile("c:\tmp.txt", True)
間違いではありませんが、FileSystemObject は、ひとつあれば足りるので、
ここを hFso.DeleteFile にしても、目的は果たせますね。


魔界の仮面弁士  2007-06-26 22:33:06  No: 136802

続き。

----------------------------------------------------
☆Command2☆

ここは問題ないとして:

----------------------------------------------------
☆Command3☆

Command1 のところで指摘した点は、重複するので飛ばします。

> .ulFlags = BIF_RETURNONLYFSDIRS ' + BIF_DONTGOBELOWDOMAIN
ビットフラグなので、+ ではなく Or で連結するのが適切ですよ。
(まぁ、コメント部なので、実際には動作に影響はしないのですけれども)

> SHGetPathFromIDList lpIDList, sbuffer
このあとに、CoTaskMemFree API の記述が抜けていますね。

> If total_con(i) = total_con(j) Then
> Else
否定比較なら、
  If total_con(i) <> total_con(j) Then
ですよ。(既にご存知かもしれませんが)

> Text2.Text = Text2.Text & m & "種類の拡張子があります" & vbCrLf
& 演算子による暗黙の型変換が行われていますが、m は数値型なので、
  Text2.Text = Text2.Text & CStr(m) & "種類の拡張子があります" & vbCrLf
のように、CStr 関数や FormatNumber 関数を使って「文字列型」に統一した方が良いですよ。

> 'あえてパスをファイルに書く
> 'だって・・・別のプロシージャに渡す方法を知らんのだもん
先に書いたように、コントロールを経由するのも一つの方法ですし、
宣言部に変数を置いておき、それを使ってやり取りするという手もあります。

ただし、
> Private hFile As File
のように、For Each で使うような「一時的な変数」を置くのは、本来は御法度です。(^^;

----------------------------------------------------
☆Command4☆

>  End
ここの部分を、「Unload Me」に変更しましょう。
End ステートメントでの強制終了は避けるべきです。

----------------------------------------------------
☆Form の Load イベント☆

> Dim j As Integer
> j = MsgBox("注意してください", vbOKCancel, "Danger!!")
As Integer でも良いですが、VB4 以降では、
As VbMsgBoxResult の方が、より適切な型となります。

> If j = 2 Then
「2」のようなマジックナンバーではなく、
「vbCancel」などの定数を使うようにしましょう。
その方が、コードの意味が分かりやすくなりますよね。

>  End
先ほどと同様、「Unload Me」に。


FOW  2007-06-26 23:23:18  No: 136803

魔界の仮面弁士さんレスありがとうございます。
最初に提示した質問から大幅に軌道がずれてしまい大変申し訳ありませんでした(汗

えっと、自分でも考えつく限りのことをしてみましたので報告等もさせていただきます。

まず、Scrrun.dep内のscrrun.dllバージョンが4.6.0.8817(だったかな?)
だったのでVB6のサービスパック6を当てました。
次に、フォルダの権限について
      共有したいフォルダでのプロパティで
      『共有』→中程にある『アクセス許可』→『Everyone』を選択
      『Everyoneのアクセス許可』が[読み取り]のみ許可にレ点があったのを
      [フルコントロール]にレ点をつけました。
これによって、英数のみ(1バイト文字)のフォルダについては指定した拡張子を持つファイルの削除が出来ました!!

しかしやはり「\\Takada\基本」のようにクライアントマシン直下が漢字(2バイト文字)のフォルダではパスが文字化けしてしまいました。
けれども「\\Takada\work\基本」のようにフォルダを切ると「基本」フォルダのフォルダ名が文字化けしないというかなり面白いことも同時に判明しました。

>「参照設定」や「オブジェクト ブラウザ」にて+、ファイル名を確認できますよ。
下の方にファイルのパスが絶対パスで出ていたのですね(ちゃんと見てない証拠・・・。

>了解です。
>ではまず、宣言部〜 Command1 の処理までを。
ここから先は熟読させていただきたいと思いますので少々お時間をください(ぺこり
あ、でも率直に感じたのは「非常に理解しやすい指摘をしてくださる人だな〜」と感じました。

今後の課題としまして、
      1、パスの文字化けの原因追求
      2、拡張子の長さや大文字小文字の区別等を考えたコード
をやっていこうと思っております。

最初の質問と格段に変わってはしまいましたが、
ななしさんの「問題点は?」や
魔界の仮面弁士さんの「おそらくは FileSystemObject または OS 側の不具合である可能性が高そう」というアドバイスにより自分のやりたかった事ができるようになったので一段落とさせていただきたいと思います。
(結果よければ全てよしという考え方は絶対だめなんだけど・・・。
なんか支離滅裂な文章になってしまいましたが
さくらさん、ななしさん、魔界の仮面弁士さん
本当にありがとうございました(ぺこり

次、質問するときは他人が解り易いように文章力の勉強もしたいと思います。


魔界の仮面弁士  2007-06-26 23:42:40  No: 136804

> 『Everyoneのアクセス許可』が[読み取り]のみ許可にレ点があったのを
> [フルコントロール]にレ点をつけました。

Everyone フルコントロールというのも、セキュリティ面ではどうかと
思いますが、まぁ、解決したようで何よりです。

> 1、パスの文字化けの原因追求
まぁ、表示が化けるだけで、オブジェクト自体は利用できるので、
問題はないのですけれどね。

表示については、Drive オブジェクトを経由することで解決できそうです。

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim f As Folder
Set f = fso.GetFolder("\\takada\基本")
'sPath = f.Path

Dim d As Drive
Set d = f.Drive
sPath = d.Path

なお、上記のように Drive.Path を経由した場合においては、
共有名に、Shift_JIS にない漢字(Unicode文字)が含まれていても、
正しく取得することができました。

> 2、拡張子の長さや大文字小文字の区別等を考えたコード
たとえば、
  If UCase(fso.GetExtensionName(フルパス)) = "TXT" Then
のようにするとか。


FOW  2007-06-27 00:08:10  No: 136805

魔界の仮面弁士さんレスありがとうございます。

>Everyone フルコントロールというのも、セキュリティ面ではどうか
確かに不特定多数が何でも出来るとなると危険度大ですね。
ここも考えてみます

>表示については、Drive オブジェクトを経由
このやり方やらせていただきます。
それと、この「sPath」って子はどこから湧いたのでしょうか?
パスを格納する変数だからString・・・かな?。

>If UCase(fso.GetExtensionName(フルパス)) = "TXT" Then
了解です、やってみます。


魔界の仮面弁士  2007-06-27 00:25:03  No: 136806

> それと、この「sPath」って子はどこから湧いたのでしょうか?
> パスを格納する変数だからString・・・かな?。
はい、Dim sPath As String です。

# 最初は、MsgBox でテストしてたんですけど、それだと
# Shift_JIS な文字列しか表示できないので、途中から
# 変数に切り替えて…そのはずみで書き漏らしました。m(_ _)m

>>If UCase(fso.GetExtensionName(フルパス)) = "TXT" Then
>了解です、やってみます。
ただし、拡張子に全角英数記号等が入る場合は使えないのが難点です。


FOW  2007-06-27 00:46:01  No: 136807

魔界の仮面弁士さんレスありがとうございます(ぺこり

>ただし、拡張子に全角英数記号等が入る場合は使えないのが難点です。
わかりました。拡張子に全角が含まれていたらはじくという工夫をしてみます。

>Dim fso As FileSystemObject
>Set fso = New FileSystemObject

>Dim f As Folder
>Set f = fso.GetFolder("\\takada\基本")
>'sPath = f.Path

>Dim d As Drive
>Set d = f.Drive
>sPath = d.Path

これは感動しました!!このようなやり方があったとは!!
自分のやりたかったことが出来たからそれで解決。としていましたのに
最初の質問にも丁寧にお答えいただき本当にありがとうございます。
ぃゃ〜・・・いい加減な自分だ


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加