【问题标题】:IOException insufficient disk space when accessing Citrix mounted drive访问 Citrix 挂载的驱动器时出现 IOException 磁盘空间不足
【发布时间】:2011-07-06 15:52:26
【问题描述】:

我遇到了一个非常奇怪的问题。我正在尝试下载一些文件并存储。我的代码相对简单直接(见下文),在我的本地机器上运行良好。

但它旨在运行在通过 Citrix 和 VPN 访问的 Windows 终端服务器上。该文件将被保存到已安装的网络驱动器中。此挂载是通过 Citrix VPN 挂载的本地 C:\ 驱动器,因此可能会涉及一些延迟。不幸的是,我没有关于整个基础设施是如何设置的内部细节......

现在我的问题是,当尝试执行 write() 调用时,下面的代码会抛出一个 IOException,告诉我磁盘上没有剩余空间。目录结构创建好了,创建了一个零字节的文件,但是从不写入内容。

驱动器上有超过 GB 的可用空间,Citrix 客户端已获得“完全访问”权限,并且使用 Windows 资源管理器或记事本在该映射驱动器上复制/写入文件工作正常。只有 Java 在这里给我带来了麻烦。

我也尝试先下载到临时文件,然后将其复制到目的地,但由于复制与原始代码中的流操作基本相同,因此行为没有变化。它仍然因磁盘空间不足异常而失败。

我不知道还能尝试什么。可以给点建议吗?

public boolean downloadToFile(URL url, File file){                                                                  
    boolean ok = false;                                                                                             

    try {                                                                                                           
        file.getParentFile().mkdirs();                                                                              

        BufferedInputStream  bis = new BufferedInputStream(url.openStream());                                       
        byte[]            buffer = new byte[2048];                                                                  
        FileOutputStream     fos = new FileOutputStream(file);                                                      
        BufferedOutputStream bos = new BufferedOutputStream( fos , buffer.length );                                 
        int size;                                                                                                   
        while ((size = bis.read(buffer, 0, buffer.length)) != -1) {                                                 
            bos.write(buffer, 0, size);                                                                             
        }                                                                                                           
        bos.flush();                                                                                                
        bos.close();                                                                                                
        bis.close();                                                                                                

        ok = true;                                                                                                  
    }catch(Exception e){                                                                                            
        e.printStackTrace();                                                                                        
    }                                                                                                               

    return ok;                                                                                                      
}

【问题讨论】:

  • 您是否可以使用其他程序在该驱动器上写入文件?
  • 更新:我现在“解决”了我的问题,方法是下载到一个临时文件,然后通过 ProcessBuilder 执行 Windows 的 xcopy 命令将该文件复制到 Citrix 驱动器上的目标位置。当然,这是一个丑陋的 hack,我仍然对这里的真正解决方案感兴趣。
  • Windows 可以写入驱动器而Java 不能,这可能表明Java 进程没有写入权限。您是否尝试过以管理员权限运行 Java 进程,或者更改 Citrix 驱动器的设置,以便非管理员程序可以写入。
  • Java-Process 是在 Citrix 导出的 Internet Explorer 中运行的签名 Applet(但我在使用基于 jar 的应用程序时遇到了同样的问题)。由于从小程序中调用 xcopy 有效,我认为这不是权限问题(否则我的 xcopy 调用将是权限提升漏洞)

标签: java windows citrix


【解决方案1】:

试试commons-io。尤其是 Util 类 FileUtilsIOUtils

在更改我们的代码以使用commons-io 之后,所有文件操作都变得更加困难。即使使用映射的网络驱动器。

【讨论】:

  • 哇。似乎 FileUtils.copyURLToFile() 工作正常。我不知道为什么,但这是一个很好的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2013-10-09
  • 2015-12-04
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多