【问题标题】:Reading file data from shared folder with authentication (FileNotFound Exception)通过身份验证从共享文件夹中读取文件数据(FileNotFound 异常)
【发布时间】:2015-01-29 10:32:21
【问题描述】:

以下是我通过验证和读取文件中的数据来访问共享文件夹中的文件的代码。(使用 JCIF)

public void findFiles() throws Exception{
         String url = rs.getString("addPolicyBatchFolder_login_url"); //username, url, password are specified in the property file
         String username = rs.getString("addPolicyBatchFolder_login_userName");
         String password = rs.getString("addPolicyBatchFolder_login_password");
         NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, username, password);

         SmbFile dir = null;
         dir = new SmbFile(url, auth);
         SmbFilenameFilter filter = new SmbFilenameFilter() {
                @Override
                public boolean accept(SmbFile dir, String name) throws SmbException {
                    return name.startsWith("starting string of file name");//picking files which has this string on the file name
                }
            };

         for (SmbFile f : dir.listFiles(filter))
         {

             addPolicyBatch(f.getCanonicalPath()); //passing file path to another method

         }
}

使用此代码,我成功地进行了身份验证,并且能够列出文件。我尝试打印规范路径(我也尝试使用f.path())并且我能够打印完整路径。

Following 是下一个方法。

public void addPolicyBatch(String filename) throws Exception{
    File csvFile = new File(filename);
        BufferedReader br = null;
        try {
            br =  new BufferedReader(new FileReader(csvFile)); //FileNotFound exception
            while((line = br.readLine()) != null){ 
                    //more code

在上述方法中,当涉及到bufferReader时,显示FleNotFoundException

如果我打印规范路径,以下是输出。

smb://sharePath/file.csv 正确路径

但是在第二种方法中(我得到异常的地方),异常如下。

java.io.FileNotFoundException: smb:\sharePath\file.csv (The filename, directory name, or volume label syntax is incorrect)

如你所见,smb: 之后只有一个\

我不确定为什么它没有传递第一种方法中打印的确切文件路径。

【问题讨论】:

  • 好吧,异常已经指出您的路径不正确。尝试使用不同的路径变体,例如。 G。带双反斜杠
  • 我尝试了几种方法。 smb:///smb://。即便如此,如果我能够列出具有正确路径的文件,那么在下一个方法中会出现什么问题?
  • 尝试其他可能性。我不能说哪个是正确的,因为我现在无法测试它,但是由于异常向您显示带有反斜杠的路径,那么我也会尝试使用这些。

标签: java csv file-io


【解决方案1】:

如果您从名称中删除前导 smb:,它应该可以工作。
或者,您可以按如下方式更改方法并使用 smb 文件创建阅读器:

public void addPolicyBatch(SmbFile smbFile) throws Exception {
    BufferedReader br = null;
    try {
        SmbFileInputStream smbStream = new SmbFileInputStream(smbFile); 
        br = new BufferedReader(new InputStreamReader(smbStream)); 
        String line; 
        while((line = br.readLine()) != null){ 
        //.... 

编辑,重命名文件。

如果要使用SmbFile重命名,需要认证对象

public static void renameSmbFile(SmbFile srcFile, String completeUrl, 
                                 NtlmPasswordAuthentication auth) throws Exception {
    SmbFile newFile = new SmbFile(completeUrl,auth);
    srcFile.renameTo(newFile);
}

Wenn 使用 File 对象,这不是必需的:

public static void renameFile(SmbFile srcFile, String nameWithoutProtocol, 
                              NtlmPasswordAuthentication auth) throws Exception {
    String fileName = srcFile.getCanonicalPath();
    fileName = fileName.substring(4);//removing smb-protocol
    new File(fileName).renameTo(new File(nameWithoutProtocol));
}

【讨论】:

  • 谢谢。那完成了工作。还有一个疑问。我试图在阅读后重命名文件。我无法将新名称字符串传递给 renameTo 方法。所以我尝试创建一个新文件(新名称)并复制内容。这是正确的,还是我可以先做?
猜你喜欢
  • 2019-11-22
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
相关资源
最近更新 更多