使用身份验证从共享文件夹中读取文件数据(FileNotFoundException)

时间:2015-01-29 10:32:21

标签: java csv file-io

以下是我用来通过验证和从文件中读取数据来从共享文件夹访问文件的代码。(使用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:

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

1 个答案:

答案 0 :(得分: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));
}