【问题标题】:Append data to existing file using SMBJ client使用 SMBJ 客户端将数据附加到现有文件
【发布时间】:2021-06-13 23:30:42
【问题描述】:

我需要使用 SMBJ 客户端将数据附加到现有文件。以下代码追加数据,但最终文件已损坏,无法读取/打开文件。

 Set<AccessMask> accessMask = new HashSet<>();
 accessMask.add(AccessMask.GENERIC_READ);
 accessMask.add(AccessMask.GENERIC_WRITE);

 Set<FileAttributes> fileAttributes = new HashSet<>();
 fileAttributes.add(FileAttributes.FILE_ATTRIBUTE_NORMAL);

 Set<SMB2CreateOptions> createOptions = new HashSet<>();
 createOptions.add(SMB2CreateOptions.FILE_RANDOM_ACCESS);

 File file = share.openFile("PATH", accessMask, fileAttributes, SMB2ShareAccess.ALL, 
                         SMB2CreateDisposition.FILE_OPEN_IF, createOptions);

 // Approach - 1
 long fileOffset = 0;
 byte[] buffer = new byte[1024*4];
 int length = inputStream.read(buffer);
 while(length != -1){
   fileOffset = share.getFileInformation("PATH").getStandardInformation().getEndOfFile();
   file.write(buffer, fileOffset, 0, lenght);
 }

//Approach - 2
 OutputStream oStream = f.getOutputStream();
     oStream.write(fileContents.getBytes());
     oStream.flush();
     oStream.close();

但是从这两种方法来看,都无法正确附加数据。

【问题讨论】:

    标签: java smb smbj


    【解决方案1】:

    这就是我的做法:

    private static void uploadAppend(File source, DiskShare diskShare,
            String destPath) throws IOException {
        if (source != null && source.exists() && source.canRead()
                && source.isFile()) {
    
            try (InputStream is = new java.io.FileInputStream(source)) {
                if (destPath != null && is != null) {
                    Set<AccessMask> accessMask = new HashSet<>(EnumSet.of(
                            AccessMask.FILE_READ_DATA,
                            AccessMask.FILE_WRITE_DATA, AccessMask.DELETE));
                    Set<SMB2ShareAccess> shareAccesses = new HashSet<>(
                            EnumSet.of(SMB2ShareAccess.FILE_SHARE_READ,
                                    SMB2ShareAccess.FILE_SHARE_WRITE,
                                    SMB2ShareAccess.FILE_SHARE_DELETE));
                    Set<FileAttributes> createOptions = new HashSet<>(
                            EnumSet.of(FileAttributes.FILE_ATTRIBUTE_NORMAL));
    
                    try (com.hierynomus.smbj.share.File file = diskShare
                            .openFile(destPath, accessMask, createOptions,
                                    shareAccesses,
                                    SMB2CreateDisposition.FILE_OPEN_IF,
                                    EnumSet.noneOf(SMB2CreateOptions.class))) {
    
                        int bufferSize = 2048;
                        if (source.length() > 20971520l) {
                            bufferSize = 131072;
                        }
                        byte[] buffer = new byte[bufferSize];
                        long fileOffset = 0;
                        int length = 0;
                        while ((length = is.read(buffer)) > 0) {
                            fileOffset = diskShare.getFileInformation(destPath)
                                    .getStandardInformation().getEndOfFile();
                            file.write(buffer, fileOffset, 0, length);
                        }
                        file.flush();
                        file.close();
                    } finally {
                        is.close();
                    }
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      下面是jcifs.smb.SmbFileOutputStreamjcifs.smb.SmbFileInputStream 类的解决方案:

      private void AppendToFile() throws Exception {
              CIFSContext base = SingletonContext.getInstance();
              CIFSContext context = base.withCredentials(new NtlmPasswordAuthentication(base, "domainName",
                      "userName", "password"));
              try (SmbFile f = new SmbFile("smb://serverName/folder/test.txt", context)) {
                  SmbFileInputStream in = new SmbFileInputStream(f);
                  byte[] buffer = new byte[1024]; //your file size
                  int bytesRead = in.read(buffer);
                  while (bytesRead > 0) {
                      bytesRead = in.read(buffer);
                  }
                  in.close();
      
      //...
      //do your operations with the data in buffer
      //...
      
      
                  SmbFileOutputStream out = f.openOutputStream(true); //true is for append mode
                  out.write(buffer);
                  out.close();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多