SMB共享文件夹操作

最近接到了要获取其他服务器上文件操作的需求,使用了网络共享文件夹的形式来进行处理。

首先在服务器上设置一个文件夹为共享文件夹,这里使用了盘符G:SMB共享文件夹操作_第1张图片

之后在本地我的电脑下邮件生成一个网络位置,输入ip所在:例子:\\172.17.16.16\G,取一个别名,例子为g;

之后即可通过这个目录操作远程的文件夹,记得设置权限为完全控制。

贴一下主要的两个工具类的方法:

package com.neusoft.jkysjbs.action.comm;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;

import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;

public class SmbFileTransfer {

  /* 
   * smb类 用于对共享文件夹的文件进行上传下载使用,直接使用file类不能获取到相关的文件对象
   * 
   */ 
    
    
    /**
     * 将本地文件上传到共享文件夹中
     */
     public static void smbUpload(String localDir,String remoteUrl) {
       InputStream in = null;
       OutputStream out = null;
       try {
           //获取图片
           File localFile = new File(localDir);
           SmbFile remoteFile = new SmbFile(remoteUrl + "/"  + localFile.getName());
           remoteFile.connect(); //尝试连接

           in = new BufferedInputStream(new FileInputStream(localFile));
           out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile));

           byte[] buffer = new byte[4096];
           int len = 0; //读取长度
           while ((len = in.read(buffer, 0, buffer.length)) != -1) {
               out.write(buffer, 0, len);
           }
           out.flush(); //刷新缓冲的输出流
       }
       catch (Exception e) {
           String msg = "发生错误:" + e.getLocalizedMessage();
           System.out.println(msg);
       }
       finally {
           try {
               if(out != null) {
                   out.close();
               }
               if(in != null) {
                   in.close();
               }
           }
           catch (Exception e) {}

           
       }
   } 
 
        
     /**
      * 将文件从共享文件夹中下载下来到本地
      * @param remoteUrl
      * @param localDir
      */
        public static void smbGet(String remoteUrl, String localDir) {
            InputStream in = null;
            OutputStream out = null;
            try {
            SmbFile remoteFile = new SmbFile(remoteUrl);
            if (remoteFile == null) {
            System.out.println("共享文件不存在");
            return;
            }
            String fileName = remoteFile.getName();
            //创建文件夹(根目录下直接创建文件可以直接new File,如果是多层目录下文件的创建,需要先创建多层文件夹,然后用输入流在文件夹相应目录下再将文件建立)
            File localFile = new File(localDir + File.separator);
            if(!localFile.exists()){//如果文件夹不存在
                //创建文件夹,mkdir是创建根目录,mkdirs创建多层目录
                localFile.mkdirs();
            }
            //创建文件
            BufferedWriter bw=new BufferedWriter(new FileWriter(localDir + File.separator + fileName));
            bw.close();
            File localFiles =  new File(localDir + File.separator + fileName);
            in = new BufferedInputStream(new SmbFileInputStream(remoteFile));
            out = new BufferedOutputStream(new FileOutputStream(localFiles));
            byte[] buffer = new byte[1024];
            while (in.read(buffer) != -1) {
            out.write(buffer);
            buffer = new byte[1024];
            }
            } catch (Exception e) {
            e.printStackTrace();
            } finally {
            try {
            out.close();
            in.close();
            } catch (Exception e) {
            e.printStackTrace();
            }
            }
            }
        
        
        public static void main(String[] args) {
               //格式 smb://共享服务器的用户:密码@ip/共享文件夹别名/其下目录
            smbGet("smb://username:[email protected]/g/ftp/test.zip","E:/test/");
            smbUpload("E:/test.zip","smb://username:[email protected]/g/ftp/");
        }
        
   
}

个人的思考是:SmbFile应该不是File的一个子类,很多方法相似,但并没有继承关系

而且应该有更简便快捷的处理办法,如果有人了解请在评论指教,多谢。

另外类似于在指定url下生成,压缩文件这种操作,使用smbFile做不到,多数用法也是上传下载我的处理办法是在本地生成好--传上去--删除本地,不得不说很粗糙,如果哪位大神有好办法也请多指教,感谢阅读。

你可能感兴趣的:(日常学习)