之前已经问了一些有关的问题,但我实在太菜了。
现在从设计开始问起。界面类似QQ的网络硬盘。
要求是 用Webservice上传下载、用Xml保存文件信息,
WinForm上是TreeView和ListView,效果类似资源管理器,
文件夹要可以新建,删除,重命名,(最好加上权限)。
文件上传,下载,重命名(使用 拖放实现上传下载)。我该怎么设计,Xml该怎么保存文件信息?
1〉                                         2>
   <NetDisk>                                   <NetDisk>
     <文件夹名>                                  <节点>
         <文件夹名>                                <path>...</path>
            <文件名>                               <大小/>
              <大小/><日期/>...                    <日期/>
            </文件名>                                 .
          </文件夹名>                                 .
     </文件夹名>                                  </节点>
   </NetDisk>                                   </NetDisk>1)该用哪种方式好,或者还有什么别的方式?Xml保存在服务器是否好?
用WebService提供方法 读,写 Xml时返回什么类型较好?2)用WebService写Xml时的权限设置问题。3)还有就是在客户端 拖放的实现,怎么才能捕捉到 从桌面或其他目录中拖文件到
窗口中TreeView和ListView中 的事件、方法,反过来也是。现在暂时遇到这么多问题,请前辈们,高手们先指导下该怎么安排,
再具体的说说怎么解决这些问题。
我能否真正进入这一行就靠各位能否帮助我做出这个小项目了,摆脱各位前辈,高手。

解决方案 »

  1.   

    干嘛要XML 文件? 多个东西 不知道多了多少麻烦要知道文件的信息 直接读取文件就可以了,例如用户登录之后,要获取文件列表信息,你就直接将指定目录下的文件列表返回就可以
      

  2.   

    看看你什么都还不会, 还要用WebService? 先基础的东西 学点起来吧
      

  3.   

    to 1)该用哪种方式好,或者还有什么别的方式?Xml保存在服务器是否好?
    用WebService提供方法 读,写 Xml时返回什么类型较好?如果为了客户端方便,你应该转化成封装好的类型,避免在客户端进行二次分析。
    to 2)用WebService写Xml时的权限设置问题。设置Aspnet用户对xml存放目录具有可写权限。
    to 3)还有就是在客户端 拖放的实现,怎么才能捕捉到 从桌面或其他目录中拖文件到
    窗口中TreeView和ListView中 的事件、方法,反过来也是。这个比较简单,参看
    http://www.codeproject.com/csharp/Explorer_Drag_Drop.asp
    其中对于拖动来说,与服务器的交互则比较麻烦写,但是基本上是可以实现的。
      

  4.   

    Knight94(愚翁) 在WebService中可不可以用System.Windows.Forms.TreeNode?
    并返回TreeNode?
      

  5.   

    to 在WebService中可不可以用System.Windows.Forms.TreeNode?你最好不要在web中用form的东西如果纯粹为了表现一个树的结构,自己去写一个也很简单。
      

  6.   

    to:Knight94(愚翁) 
        设置Aspnet用户对xml存放目录具有可写权限。是在 计算机管理-〉Internet信息服务-〉网站-〉 默认网站-〉...-〉存放xml文件夹
    对他右击属性,再下来怎么弄?谢谢你提供的拖动事例和建议。
      

  7.   

    我该怎么设计,Xml该怎么保存文件信息?
    答:XML可按照树状结构进行设计,他的结构和你的treeview结构保持一致,如
    <root>
      <sub>
          <list></list>  </sub>
      <sub>
          <sub></sub>
          <list></list>  </sub>
    </root>
    这样便于你生成treeview,同时便于你生成XMLPath查找节点
    生成treeview用递归即可完成,XMLPath连接节点即可生成
    参考如下方法
    private void ConstructTree(XmlNode root,TreeNode node) //递归增加目录
    {
    treeView.BeginUpdate();
    treeView.ImageList=imageList;
    foreach(XmlNode xn in root.ChildNodes)
    {
    if(xn.NodeType == XmlNodeType.Element)
    {
    if ("list" == xn.Name.ToString() )
    {
    TreeNode nn = node.Nodes.Add(xn["title"].InnerText);
    nn.Tag = "list";
    nn.ImageIndex=0;
    nn.SelectedImageIndex=1;
    ConstructTree(xn,nn); //递归
    }
    else if ("sub" == xn.Name.ToString() )
    {
    TreeNode nn = node.Nodes.Add(xn["title"].InnerText);
    nn.Tag = "sub";
    nn.ImageIndex=2;
    nn.SelectedImageIndex=3;
    ConstructTree(xn,nn); //递归
    }

    } }
    treeView.EndUpdate();
    }1)该用哪种方式好,或者还有什么别的方式?Xml保存在服务器是否好?
    用web services可行,你可以在xml里面直接保存二进制,但是这样会让你的xml非常庞大,建议你在xml里面保存你上传后的文件路径,文件名,大小等你需要显示在listview上的信息2)用WebService写Xml时的权限设置问题。
      和普通web一样
    3)还有就是在客户端 拖放的实现,怎么才能捕捉到 从桌面或其他目录中拖文件到
    首先将AllowDrag设为true
    任何托放都离不开三个事件
    1. ItemDrag : 拖动的开始
    if (e.Button == MouseButtons.Left)
        {           DoDragDrop(“这里是你传递给接受控件的变量,你可以这这里放置文件路径”, DragDropEffects.Move);   
        }
    2. Drag_Enter:设置拖动
            e.Effect = e.AllowedEffect;
        
    3. Drag_Drop:接受拖动
    string filePath = (string)e.Data.GetData(typeof(具体类型我不记得了,应该是个text类型,查msnd));   
      

  8.   

    to 是在 计算机管理-〉Internet信息服务-〉网站-〉 默认网站-〉...-〉存放xml文件夹
    对他右击属性,再下来怎么弄?不是有可写选项吗,打上钩保存。
      

  9.   

    明天休假,如果后天你还没有弄出来,我到公司帮你查一下msdn吧, 好像是DataFormats.Text
      

  10.   

    to:Knight94(愚翁) 
       不是有可写选项吗,打上钩保存。在之前的帖子上我看了你的回答这样做了,但在不通过Web在本地可以写,
    一到调用Web就 报文件不可访问。所以我再确定一下。
    过会我再试试,谢谢你。同样谢谢 idda(碗掉了,头大个疤) 
      

  11.   

    又有问题了,XPath 能否可以根据 节点的,深度、属性、其子节点,来直接
    选中一个节点?
      

  12.   

    to 又有问题了,XPath 能否可以根据 节点的,深度、属性、其子节点,来直接
    选中一个节点?xmlnode.selectsinglenode方法,但是你首先写入的时候需要把属性进行标注。
      

  13.   

    to:
      xmlnode.selectsinglenode方法,但是你首先写入的时候需要把属性进行标注。xmlnode此节点我是从别的文件传过来的,不是从 被查询文件 中选择的,
    但这两个节点完全相同,我是用此方法仍然会从 被查询文件 中得到想要的结果?
      

  14.   

    如果你存放文件的盘是NTFS的话,而且又是XP PRO系统那么你要在将ASPNET所在用户组给予权限,最好是完全控制!
    在 ASP.NET 中默认是以一个叫做 ASPNET 的虚拟用户的身份来访问、操作数据库的,你可以在“控制面板”-“管理工具”-“计算机管理”-“本地用户和组”-“用户”中看到这个用户,默认情况下是:   
        全名:ASP.NET 计算机帐户   
        描述为:用于运行 ASP.NET 辅助进程(aspnet_wp.exe)的帐户。   
        隶属于:Users组。   
      使用这么一个隶属于 Users 组的用户来进行文件操作、数据库操作的风险是要比用一个 Administrators 组的用户的风险要小得多。但 Windows XP Professional 中的“安全”选项卡默认是关闭的,可以将“控制面板”-“文件夹选项”-“查看”选项卡中的“高级设置”中“使用简单共享(推荐)”一项的“√”去除,“确定”之后,再次按照上面的方法即可看到“安全”选项卡了。
      

  15.   

    又有问题了,XPath 能否可以根据 节点的,深度、属性、其子节点,来直接选中一个节点?
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个有点矛盾,因为子节点一般都不只一个XPATH对深度、属性、子节点之类的查询是非常简单的,网上很多XPATH的基础教学就是以这些东西作为例子的
      

  16.   

    to:
       xmlnode.selectsinglenode方法  我用的这个方法的xmlnode不是 被查询文件 中的,使另一个文件中传递
    过来的,这xmlnode.selectsinglenode方法也能在 被查询文件 中查找?
      

  17.   

    这种东西用web service本身就是一种错误,时髦的东西未必实用
      

  18.   

    to:不是有可写选项吗,打上钩保存。这样做了还是不行,
      System.Web.Services.Protocols.SoapException: 服务器无法处理请求。 ---> System.UnauthorizedAccessException: 对路径“C:\Inetpub\wwwroot\DiskWebSite\App_LocalResources\DiskXML.xml”的访问被拒绝。
       在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
       在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
       在 Service.WriteDiskXML(XmlNode newChild, String DirPath)
       --- 内部异常堆栈跟踪的结尾 ---
    换成虚拟路径 报 不支持uri
      

  19.   

    你问的问题都不是设计方面的问题,而是具体实现的底层计算机技术问题。我对你的设计方案不报希望。呵呵,希望你不要因为我的打击而气馁啊!其实任何项目不论复杂与否,给足够的时间、足够地烧钱、足够地重视测试工作,都是能够拼凑出来的。因为软件不像硬件那样直接关系到操作者的生命财产,玩软件就像玩赛车游戏一样撞毁了还可以再从头开始。但是设计思路不落实,说明你还会摔很多跤,如果幸运的话突然搞明白软件工程是怎么一回事,能顺利地从事更多相关工作。
    关于通讯信令的设计问题:
    这实际上要看你的类库接口、功能、流程的设计而定。假设你需要将“读取某个目录之下的文档目录集合”作为一个接口方法,那么信令中就会有对应的一条指令,也就会有此条指令返回的格式定义。当你对需求说明清楚的时候,例如在多个顺序脚本中都有类似“放入一个文件-->刷新此文件所在的目录”的原子操作,此时就会发现不能依赖于“读取服务器上所有文档的目录”这一种功能。
    关于权限问题:
    网路硬盘不能假设用户都是在一个域或者都在服务器的工作组上注册过的用户,因此根据这些出发点所“设计”的权限概念都是不可落实的。QQ是根据“我的好友、所有人”等网络社区的脚色和用户定义来设计权限的。切入点必须依据领域需求来设计,如果先去考虑计算机技术,根本不能将设计落实。
      

  20.   

    照做了,可是没有找到“安全”选项卡。
    ——如果你的硬盘格式不是NTFS的,就不会有“安全”选项卡。
      

  21.   

    to:如果你的硬盘格式不是NTFS的,就不会有“安全”选项卡。是NTFS的
      

  22.   

    我调用 webservice:service1.WriteDiskXML(参数1,参数2)
    在这一句报错:
     未处理 System.Web.Services.Protocols.SoapException
      Message="System.Web.Services.Protocols.SoapException: 服务器无法处理请求。 ---> System.IO.IOException: 文件“C:\\Inetpub\\wwwroot\\DiskWebSite\\App_LocalResources\\DiskXML.xml”正由另一进程使用,因此该进程无法访问该文件。\n   在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\n   在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)\n   在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)\n   在 Service.WriteDiskXML(XmlNode newChild, String DirPath)\n   --- 内部异常堆栈跟踪的结尾 ---"“正由另一进程使用”,请帮忙解决,最好说明一下原因。
      

  23.   

    我用Web服务可以读同一站点下的XML文件,可就是不能写。
    我已经将xmL的文件夹设为“可写入”。极度需要帮助阿