From 1afb423a521f9b992f47dd82aad16f1536a72640 Mon Sep 17 00:00:00 2001 From: kochi Date: Wed, 1 Apr 2020 23:32:41 +0900 Subject: [PATCH] =?UTF-8?q?#143=20=E3=83=8D=E3=83=83=E3=83=88=E3=83=AF?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=83=AA=E3=82=BD=E3=83=BC=E3=82=B9=E4=B8=80?= =?UTF-8?q?=E8=A6=A7=E3=82=92=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browsableObjects.py | 30 +++++++++++++++---- lists/drive.py | 71 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 90 insertions(+), 11 deletions(-) diff --git a/browsableObjects.py b/browsableObjects.py index 9543d20..15958e7 100644 --- a/browsableObjects.py +++ b/browsableObjects.py @@ -98,7 +98,11 @@ def GetListTuple(self): class Drive(FalconBrowsableBase): """ドライブを表す。""" def Initialize(self, letter, free, total, type, name=""): - """必要な情報をセットする""" + """ + 必要な情報をセットする + 変数名はNetworkResourceと互換しているため、変更した場合は両方に反映すること! + + """ self.letter=letter self.free=free self.total=total @@ -130,7 +134,10 @@ def UpdateTypeString(self): def GetListTuple(self): - """表示に必要なタプルを返す。""" + """ + 表示に必要なタプルを返す。 + 変更した場合はNetworkResourceの方にも反映すること! + """ return (self.basename, self.letter, misc.ConvertBytesTo(self.free, misc.UNIT_AUTO, True), misc.ConvertBytesTo(self.total, misc.UNIT_AUTO, True), self.typeString) class Stream(FalconBrowsableBase): @@ -149,11 +156,22 @@ def GetListTuple(self): class NetworkResource(FalconBrowsableBase): """ネットワーク上のディスクリソースを表す。このオブジェクトは情報を保持するだけで、指し示すリソースにアクセスすることはない。フルパスは計算可能なのだが、二重に値を生成したくはないので、あえて値を渡すようにしている。""" def Initialize(self,basename="", fullpath="", address=""): - """必要な情報をセットする""" + """ + 必要な情報をセットする + ドライブリストに表示するため、変数名はDriveのものと互換 + """ self.basename=basename self.fullpath=fullpath - self.size=-1 + self.letter="" + self.free=-1 + self.total=-1 + self.type=-1 + self.typeString=_("ネットワークリソース") self.address=address + def GetListTuple(self): - """表示に必要なタプルを返す。""" - return (self.basename, self.basename, address) + """ + 表示に必要なタプルを返す。 + ここもDriveと同じ内容に統一 + """ + return (self.basename, self.letter,"", "", self.typeString) diff --git a/lists/drive.py b/lists/drive.py index f30d971..b429b6c 100644 --- a/lists/drive.py +++ b/lists/drive.py @@ -8,12 +8,16 @@ import logging import win32api import win32file +import win32wnet +import socket + import pywintypes import constants import misc import browsableObjects import globalVars import errorCodes + from simpleDialog import dialog from .base import * from .constants import * @@ -37,8 +41,9 @@ def Initialize(self,lst,silent=False): t=misc.Timer() self.drives=[] self.unusableDrives=[] + self.networkResources=[] if isinstance(lst,list):#パラメータがリストなら、browsableObjects のリストとして処理刷る(ファイルリストを取得しないでコピーする) - self.drives=lst + self._copyFromList(lst) return errorCodes.OK #end copy @@ -50,11 +55,47 @@ def Initialize(self,lst,silent=False): if drv&check: self.Append(i)#ドライブ検出 check<<=1 #end ドライブ25個分調べる + + #ネットワークリソースの追加 + self._GetNetworkResources() + self.log.debug("Drives list created in %d seconds." % t.elapsed) - self.log.debug(str(len(self.drives))+" drives found.") + self.log.debug(str(len(self.drives))+" drives,"+str(len(self.unusableDrives))+" unusableDrives and "+str(len(self.networkResources))+" networkResources found.") self.ApplySort() return errorCodes.OK + def _copyFromList(self,lst): + self.log.debug("Copying from list...") + for elem in lst: + if isinstance(elem,browsableObjects.NetworkResource): + self.networkResources.append(elem) + elif elem.total>=0: + self.drives.append(elem) + else: + self.unusableDrives.append(elem) + #end ファイルかフォルダか + #end for + #end _copyFromList + + def _GetNetworkResources(self): + self.log.debug("Getting networkResource list...") + try: + h=win32wnet.WNetOpenEnum(5,1,0,None) + #5=RESOURCE_CONTEXT + #1=RESOURCETYPE_DISK + lst=win32wnet.WNetEnumResource(h,64) #65以上の指定不可 + win32wnet.WNetCloseEnum(h); + except win32net.error as er: + dialog(_("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)}) + return + #end 情報取得失敗 + lst.pop(0) #先頭はドライブではない者が入るので省く + for l in lst: + s=browsableObjects.NetworkResource() + s.Initialize(l.lpRemoteName[2:],l.lpRemoteName,socket.getaddrinfo(l.lpRemoteName[2:],None)[0][4][0]) + self.networkResources.append(s) + #end 追加ループ + def GetColumns(self): """このリストのカラム情報を返す。""" return { @@ -97,6 +138,8 @@ def GetItems(self): lst.append(elem.GetListTuple()) for elem in self.unusableDrives: lst.append(elem.GetListTuple()) + for elem in self.networkResources: + lst.append(elem.GetListTuple()) return lst def GetItemPaths(self): @@ -106,11 +149,29 @@ def GetItemPaths(self): lst.append(elem.fullpath) for elem in self.unusableDrives: lst.append(elem.fullpath) + for elem in self.networkResources: + lst.append(elem.fullpath) return lst def GetElement(self,index): """インデックスを指定して、対応するリスト内のオブジェクトを返す。""" - return self.drives[index] if index