通过身份验证从共享文件夹读取文件数据(FileNotFound 异常)

Reading file data from shared folder with authentication (FileNotFound Exception)

以下是我用来通过验证和读取文件数据从共享文件夹访问文件的代码。(使用 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())并且我能够打印完整路径。

下面是下一个方法

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 正确路径

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

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

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

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

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

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));
}