Encountered problems writing to files using SMBJ… here is a solution to the problem.
Encountered problems writing to files using SMBJ
Please help. I can’t create and write files using SMBJ. I’m getting this error:
com.hierynomus.mssmb2.SMBApiException: STATUS_OBJECT_NAME_NOT_FOUND (0xc0000034): Create failed for <file path>
Is this a Windows error or an SMBJ error? Am I using the SMBJ API correctly? I don’t know much about Windows file properties/options.
String fileName ="EricTestFile.txt";
String fileContents = "Mary had a little lamb.";
SMBClient client = new SMBClient();
try (Connection connection = client.connect(serverName)) {
AuthenticationContext ac = new AuthenticationContext(username, password.toCharArray(), domain);
Session session = connection.authenticate(ac);
Connect to Share
try (DiskShare share = (DiskShare) session.connectShare(sharename)) {
for (FileIdBothDirectoryInformation f : share.list(folderName, "*.*")) {
System.out.println("File : " + f.getFileName());
}
share.openFile(path, accessMask, attributes, shareAccesses, createDisposition, createOptions)
Set<FileAttributes> fileAttributes = new HashSet<>();
fileAttributes.add(FileAttributes.FILE_ATTRIBUTE_NORMAL);
Set<SMB2CreateOptions> createOptions = new HashSet<>();
createOptions.add(SMB2CreateOptions.FILE_RANDOM_ACCESS);
File f = share.openFile(folderName+"\\"+fileName, new HashSet(Arrays.asList(new AccessMask[]{AccessMask.GENERIC_ALL})), fileAttributes, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OVERWRITE, createOptions);
OutputStream oStream = f.getOutputStream();
oStream.write(fileContents.getBytes());
oStream.flush();
oStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
Solution
If the file you are trying to open does not already exist, you will need to use a different SMB2CreateDisposition
. You are now using FILE_OVERWRITE
, which is recorded as:
Overwrite the file if it already exists; otherwise, fail the operation. MUST NOT be used for a printer object.
You may want to use FILE_OVERWRITE_IF
, it will:
Overwrite the file if it already exists; otherwise, create the file. This value SHOULD NOT be used for a printer object.