smbj: файл помечен для удаления, но не удален - PullRequest
0 голосов
/ 02 октября 2018

У меня небольшое приложение (.ear), развернутое в профиле свободы.Один из компонентов ищет в csv-файлах общий каталог Windows, после обработки переместите его.Я использую SMBJ для выполнения этой работы (скопируйте в dest и затем удалите его).Приложение просыпается каждую минуту, чтобы выполнить эту задачу.Как только файл прочитан, он копирует файл в dest, но при удалении помечает для удаления, а не удаляет его.

Вторая итерация задания снова выбирает этот файл и не может прочитать, так как он помечен для удаления.Мне сказали закрыть дескриптор файла, и мой код обрабатывает все это, и все же я сталкиваюсь с проблемами.Может кто-нибудь сказать мне, что я здесь делаю не так.

public boolean moveFile(String srcFilePath, String destFilePath) {
    try {
        DiskShare srcShare=null, destShare=null;
        Connection srcConnection=null, destConnection=null;
        Session srcSession=null, destSession=null;
        String srcPath=null, destPath=null;
        SMBClient client = new SMBClient();

        String srcParts[] = getPartsOfSharedPath(srcFilePath);
        srcConnection = client.connect(srcParts[0]);
        srcSession = srcConnection.authenticate(auth);
        srcShare = (DiskShare)srcSession.connectShare(srcParts[1]);
        srcPath = srcParts[2];

        String destParts[] = getPartsOfSharedPath(destFilePath);
        destConnection = client.connect(destParts[0]);
        destSession = destConnection.authenticate(auth);
        destShare = (DiskShare)destSession.connectShare(destParts[1]);
        destPath = destParts[2];

        //System.out.println("Remote to Remote");
        Set<SMB2ShareAccess> s = new HashSet<>();
        s.add(SMB2ShareAccess.ALL.iterator().next());
        try(com.hierynomus.smbj.share.File srcFile = srcShare.openFile(srcPath, EnumSet.of(AccessMask.GENERIC_READ), null, s, SMB2CreateDisposition.FILE_OPEN, null);
                InputStream in = srcFile.getInputStream();
                com.hierynomus.smbj.share.File destFile = destShare.openFile(destPath, EnumSet.of(AccessMask.GENERIC_WRITE), null, SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OVERWRITE_IF, null);
                OutputStream out = destFile.getOutputStream()){

                int bytesRead;
                byte[] buffer = new byte[1024];
                while((bytesRead = in.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesRead);
                }
                out.flush();
            }catch(IOException ex){
                logger.logError("", ex);
            }
        }

        client.close();

        return deleteFile(srcFilePath);

    } catch(SMBApiException | IOException e){
        logger.logError("",e);
    }
    return false;
}

public boolean deleteFile(String fileName){
try{
    String srcParts[] = getPartsOfSharedPath(fileName);
    try (SMBClient client = new SMBClient();
        Connection srcConnection = client.connect(srcParts[0]);
        Session srcSession = srcConnection.authenticate(auth);                        
        DiskShare srcShare = (DiskShare)srcSession.connectShare(srcParts[1])) {

        srcShare.rm(srcParts[2]);
        return true;
    }
}            
catch(IOException ex){
    logger.logError("",ex);            
}

return false;}

...