当前位置: 首页 > 编程语言 > C#

网络文件夹浏览器服务分享

时间:2023-04-11 10:33:36 C#

NetworkFolderBrowserService网上有一些类似的问题-这里甚至还有一些问题,但即使这些问题看起来很愉快,我也找不到办法实际上,我需要一些东西。我正在尝试将远程目录浏览功能添加到基于Web的管理控制面板(基于Intranet)。在这一点上,我不需要担心安全问题,因为这是在别处处理的。为此,我使用接受服务器名称和共享/文件夹路径作为参数的Web服务。我只需要它返回此路径的子目录(如果有的话)。听起来并不难,是吗?好吧,那是(至少对我而言!)我唯一需要帮助的是实际生成服务器的目录列表和提供的路径。感谢所有帮助,但请不要只链接到我可能已经看到但未能找到有效解决方案的网站;他们中的大多数人甚至似乎都没有按照标题所暗示的去做。一些解释也会有帮助!干杯您可以使用此处描述的方法使用Interop。我对代码进行了一些修改以提出这个问题。我没有对此进行过广泛的测试,因此它可能有错误,但它应该可以帮助您入门。privateListGetSubDirectories(stringserverName,stringfolderPath){ListsubDirectories=newList();stringfolder_path=Path.Combine(serverName,folderPath);IntPtrINVALID_HANDLE_VALUE=newIntPtr(-1);WIN32_FIND_DATA查找数据;IntPtr查找句柄;findHandle=FindFirstFile(folder_path,outfindData);如果(findHandle==INVALID_HANDLE_VALUE){interror=Marshal.GetLastWin32Error();Console.WriteLine(error.ToString());返回空值;}do{try{if((findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY)subDirectories.Add(findData.cFileName);}catch(Exceptionex){Console.WriteLine(ex.ToString());}}while(FindNextFile(findHandle,outfindData));查找关闭(查找句柄);返回子目录;}publicconstintFILE_ATTRIBUTE_DIRECTORY=0x10;[DllImport("kernel32",SetLastError=true,CharSet=CharSet.Auto)]publicstaticexternIntPtrFindFirstFile(stringlpFileName,outWIN32_FIND_DATAlpFindFileD阿塔);[DllImport("kernel32",SetLastError=true,CharSet=CharSet.Auto)]publicstaticexternboolFindNextFile(IntPtrhFindFile,outWIN32_FIND_DATAlpFindFileData);[DllImport("kernel32",SetLastError=true,CharSet=CharSet.Auto)]publicstaticexternboolFindClose(IntPtrhFindFile);[StructLayout(LayoutKind.Sequential)]publicstructFILETIME{publicuintdwLowDateTime;publicuintdwHighDateTime;};[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]publicstructWIN32_FIND_DATA{publicuintdwFileAttributes;publicSystem.Runtime.InteropServices.ComTypes.FILETIMEftCreationTime;公共System.Runtime.InteropServices.ComTypes.FILETIMEftLastAccessTime;公共System.Runtime.InteropServices.ComTypes.FILETIMEftLastWriteTime;公共单位nFileSizeHigh;公共单位nFileSizeLow;publicuintdwReserved0;publicuintdwReserved1;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)]publicstringcFileName;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=14)]publicstringcAlternateFileName;}[DllImport("kernel32.dll",CharSet=CharSet.Auto)]publicstaticexternboolCloseHandle(IntPtrhandle);你可以这样称呼它:varsubdirectories=GetSubDirectories(@"\[serverName]",@"[folderPath]*");您必须按照MSDN添加“*”在网络共享上,您可以使用以下形式的lpFileName:“ServerShare*”但是,您不能使用指向共享本身的lpFileName的指针;例如,“服务器共享”无效。不确定我们是否可以做到这一点。我们遇到了类似的问题,但最终通过提供共享路径(SERVERNAMEFOLDER)解决了这个问题。最重要的web服务应使用具有访问目录的完全权限的帐户,否则将向调用客户端抛出与权限相关的异常。好吧,实际上它可以使用NetShareEnumWin32API函数来完成。但这里是用于枚举本地和远程计算机上的网络共享并将本地文件路径转换为??UNC路径的.NET包装器类。请参阅文章网络共享和UNC路径。要在.NET中枚举指定文件夹的子文件夹,可以使用DirectoryInfo.EnumerateDirectories方法。枚举某些计算机的共享,如果隐藏的管理共享如C$、ADMIN$、print$等对你不重要或者使用NetShareEnum枚举所有共享,你可以使用WNetEnumResource原生函数。相应的代码可以是使用系统;使用System.Collections.Generic;使用System.Linq;使用System.IO;使用System.Runtime.InteropServices;命名空间子文件夹{staticinternalclassNative{[DllImport("Netapi32.dll",SetLastError=true)]internalstaticexternuintNetApiBufferFree(IntPtrbuffer);[DllImport("Netapi32.dll",CharSet=CharSet.Unicode)]internalstaticexternuintNetShareEnum(stringserverName,intlevel,refIntPtrbufPtr,uintprefmaxlen,refintentriesread,refinttotalentries,refintresumeHandle);[DllImport("MPR.dll",CharSet=CharSet.Auto)]internalstaticexternuintWNetEnumResource(IntPtrhEnum,refintlpcCount,IntPtrlpBuffer,refintlpBufferSize);[DllImport("MPR.dll",CharSet=CharSet.Auto)]internalstaticexternuintWNetOpenEnum(ResourceScopedwScope,ResourceTypedwType,ResourceUsagedwUsage,IntPtrlpNetResource,outIntPtrlphEnum);[DllImport("MPR.dll",CharSet=CharSet.Auto)]内部静态externuintWNetCloseEnum(IntPtrhEnum);内部结构MaxPreferredLength=0xFFFFFFFF;内部常量intNerrSuccess=0;内部枚举NetError:uint{NerrSuccess=0,NerrBase=2100,NerrUnknownDevDir=(NerrBase+16),NerrDuplicateShare=(NerrBase+18),NerrBufTooSmall=(NerrBase+23),}内部枚举ShareType:uint{StypeDisktree=0,StypePrintq=1,StypeDevice=2,StypeIpc=3,StypeSpecial=0x80000000,}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]publicstructShareInfo1{publicstringshi1_netname;publicuintshi1_type;公共字符串shi1_remark;publicShareInfo1(stringsharename,uintsharetype,stringremark){shi1_netname=sharename;shi1_type=共享类型;shi1_remark=备注;}publicoverridestringToString(){returnshi1_netname;}}publicenumResourceScope:uint{ResourceConnected=0x00000001,ResourceGlobalnet=0x00000002,ResourceRemembered=0x00000003,ResourceRecent=0x00000004,ResourceContext=0x00000005}publicenumResourceType:uint{ResourcetypeAny=0x00000000,ResourcetypeDisk=0x00000001,ResourcetypePrint=0x00000002,ResourcetypeReserved=0x00000008,ResourcetypeUnknown=0xFFFFFFFF}publicenumResourceUsage:uint{ResourceusageConnectable=0x00000001,ResourceusageContainer=0x00000002,ResourceusageNolocaldevice=0x00000004,ResourceusageSibling=0x00000008,ResourceusageAttached=0x00000010,ResourceusageAll=(ResourceusageConnectable|ResourceusageContainer|ResourceusageAttached),ResourceusageReserved=0x80000000}publicenumResourceDisplaytype:uint{ResourcedisplaytypeGeneric=0x00000000,ResourcedisplaytypeDomain=0x00000001,ResourcedisplaytypeServer=0x00000002,ResourcedisplaytypeShare=0x00000003,ResourcedisplaytypeFile=0x00000004,ResourcedisplaytypeGroup=0x00000005,ResourcedisplaytypeNetwork=0x00000006,ResourcedisplaytypeRoot=0x00000007,ResourcedisplaytypeShareadmin=0x00000008,ResourcedisplaytypeDirectory=0x00000009,ResourcedisplaytypeTree=0x0000000A,ResourcedisplaytypeNdscontainer=0x0000000B}[StructLayout(LayoutKind.Sequential)]publicstructNetResource{publicResourceScopedwScope;公共资源类型dwType;公共资源显示类型dwDisplayType;公共资源使用dwUsage;[MarshalAs(UnmanagedType.LPTStr)]publicstringlpLocalName;[MarshalAs(UnmanagedType.LPTStr)]publicstringlpRemoteName;[MarshalAs(UnmanagedType.LPTStr)]publicstringlpComment;[MarshalAs(UnmanagedType.LPTStr)]publicstringlpProvider;}}classProgram{staticIEnumerableGetShares(stringcomputerName){varresources=newList();IntPtrhEnum=IntPtr.Zero,pResource=IntPtr.Zero;尝试{varresource=newNative.NetResource();intbufferSize=163840;resource.dwType=Native.ResourceType.ResourcetypeAny;resource.dwScope=Native.ResourceScope.ResourceGlobalnet;资源.dwUsage=Native.ResourceUsage.ResourceusageContainer;resource.lpRemoteName=计算机名;pResource=Marshal.AllocHGlobal(Marshal.SizeOf(resource));Marshal.StructureToPtr(资源,pResource,假);uintstatus=Native.WNetOpenEnum(Native.ResourceScope.ResourceGlobalnet,Native.ResourceType.ResourcetypeDisk,0,pResource,outhEnum);if(status!=0)返回资源;intnumberOfEntries=-1;IntPtrpBuffer=Marshal.AllocHGlobal(bufferSize);status=Native.WNetEnumResource(hEnum,refnumberOfEntries,pBuffer,refbufferSize);if(status==Native.NerrSuccess&&numberOfEntries>0){varptr=pBuffer;for(inti=0;iGetAllShares(stringcomputerName){varshares=newList();IntPtrbufPtr=IntPtr.Zero;intentriesread=0;inttotalentries=0;intresumeHandle=0;intnStructSize=Marshal.SizeOf(typeof(Native.ShareInfo1));try{uintret=Native.NetShareEnum(computerName,1,refbufPtr,Native.MaxPreferredLength,refentriesread,reftotalentries,refresumeHandle);如果(ret==(uint)Native.NetError.NerrSuccess){varcurrentPtr=bufPtr;for(inti=0;iGetSubdirectories(stringroot){vardirInfo=newDirectoryInfo(root);return(frominfoindirInfo.EnumerateDirectories()selectinfo.Name).ToList();}staticvoidMain(){varroot=@"\OK01Users";Console.WriteLine("{0}的子目录:",root);foreach(vardirinGetSubdirectories(root)){Console.WriteLine(dir);}Console.WriteLine();root=@"\OK01UsersPublic";Console.WriteLine("{0}的子目录:",root);foreach(vardirinGetSubdirectories(root)){Console.WriteLine(dir);}Console.WriteLine();root=@"\OK01";Console.WriteLine("{0}的所有共享(包括隐藏的):",root);foreach(varshareNameinGetAllShares(root)){Console.WriteLine(shareName);}Console.WriteLine();root=@"\OK01";Console.WriteLine("Sharesof{0}:",root);foreach(varshareNameinGetShares(root)){Console.WriteLine(shareName);}}}}产生的输出类似于\OK01Users的子目录:所有用户ASP.NETv4.0默认默认用户MSSQL$SQL2012OlegPublic\OK01UsersPublic的子目录:桌面文档下载收藏夹库音乐图片录制电视漫游视频所有共享\OK01(inclusivehidden):ADMIN$C$print$Q$UsersVirtualMachinesVMwareSharesof\OK01:UsersVirtualMachinesVMwareAPI它不包含真正的错误报告。以上就是《C#学习教程:网络文件夹浏览器服务分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: