@Override public boolean exists() { Channel channel = null; try { channel = SFTPSession.getInstance().getSFTPChannel(mUri); SftpATTRS attrs = ((ChannelSftp)channel).stat(mUri.getPath()); channel.disconnect(); return attrs !=null; } catch (Exception e) { if(channel!=null&&channel.isConnected()) channel.disconnect(); e.printStackTrace(); }finally { if(channel!=null&&channel.isConnected()) channel.disconnect(); } return false; }
private StatInfo createStatInfo(String dirName, String baseName, SftpATTRS attrs, ChannelSftp cftp) throws SftpException { String linkTarget = null; if (attrs.isLink()) { String path = dirName + '/' + baseName; RemoteStatistics.ActivityID activityID = RemoteStatistics.startChannelActivity("readlink", path); // NOI18N try { if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "performing readlink {0}", path); } linkTarget = cftp.readlink(path); } finally { RemoteStatistics.stopChannelActivity(activityID); } } Date lastModified = new Date(attrs.getMTime() * 1000L); StatInfo result = new FileInfoProvider.StatInfo(baseName, attrs.getUId(), attrs.getGId(), attrs.getSize(), attrs.isDir(), attrs.isLink(), linkTarget, attrs.getPermissions(), lastModified); return result; }
@Override public FileEntry getFileEntry(String filename) throws Exception { ChannelSftp c = init(filename); try { FileEntry fileEntry = new FileEntry(); String sessionPath = extractSessionPath(filename); SftpATTRS attr = c.stat(sessionPath); setFromAttrs(fileEntry, attr); fileEntry.path = filename; fileEntry.displayName = getFilename(sessionPath); tryDisconnect(c); return fileEntry; } catch (Exception e) { logDebug("Exception in getFileEntry! " + e); tryDisconnect(c); throw convertException(e); } }
/** * Convert the file information in LsEntry to a {@link FileStatus} object. * * * @param sftpFile * @param parentPath * @return file status * @throws IOException */ private FileStatus getFileStatus(ChannelSftp channel, LsEntry sftpFile, Path parentPath) throws IOException { SftpATTRS attr = sftpFile.getAttrs(); long length = attr.getSize(); boolean isDir = attr.isDir(); boolean isLink = attr.isLink(); if (isLink) { String link = parentPath.toUri().getPath() + "/" + sftpFile.getFilename(); try { link = channel.realpath(link); Path linkParent = new Path("/", link); FileStatus fstat = getFileStatus(channel, linkParent); isDir = fstat.isDirectory(); length = fstat.getLen(); } catch (Exception e) { throw new IOException(e); } } int blockReplication = 1; // Using default block size since there is no way in SFTP channel to know of // block sizes on server. The assumption could be less than ideal. long blockSize = DEFAULT_BLOCK_SIZE; long modTime = attr.getMTime() * 1000; // convert to milliseconds long accessTime = 0; FsPermission permission = getPermissions(sftpFile); // not be able to get the real user group name, just use the user and group // id String user = Integer.toString(attr.getUId()); String group = Integer.toString(attr.getGId()); Path filePath = new Path(parentPath, sftpFile.getFilename()); return new FileStatus(length, isDir, blockReplication, blockSize, modTime, accessTime, permission, user, group, filePath.makeQualified( this.getUri(), this.getWorkingDirectory())); }
public SFTPFile2(SftpATTRS stat, String filename, Uri uri) { if (filename == null){ throw new IllegalArgumentException("filename cannot be null"); } if (uri == null) { throw new IllegalArgumentException("uri cannot be null"); } mUriString = uri.toString(); mName = filename; mIsDirectory = stat.isDir(); mIsFile = !stat.isDir(); mLastModified = stat.getMTime(); //TODO : permissions mCanRead = true; mCanWrite = true; mLength = stat.getSize(); }
private EncFSFileInfo LsEntry2EncFSFileInfo(String parentPath, LsEntry file){ EncFSFileInfo result; try { String name = file.getFilename(); SftpATTRS attrs = file.getAttrs(); long mtime = attrs.getMTime(); boolean isDir = attrs.isDir(); long length = attrs.getSize(); String relativePath=this.getRelativePathFromAbsolutePath(parentPath); if (name.endsWith("/")) name=name.substring(0,name.length()-1); result = new EncFSFileInfo(name,relativePath,isDir,mtime,length,true,true,true); } catch (Exception e){ throw new RuntimeException(e); } return result; }
public boolean exists(String filename) throws FileSystemException { // we have to be connected if (channel == null) { throw new FileSystemException("Not yet connected to SFTP server"); } // easiest way to check if a file already exists is to do a file stat // this method will error out if the remote file does not exist! try { SftpATTRS attrs = channel.stat(filename); // if we get here, then file exists return true; } catch (SftpException e) { // map "no file" message to return correct result if (e.getMessage().toLowerCase().indexOf("no such file") >= 0) { return false; } // otherwise, this means an underlying error occurred throw new FileSystemException("Underlying error with SFTP session while checking if file exists", e); } }
private List<FileBean> _buildFiles(Vector ls,String dir) throws Exception { if (ls != null && ls.size() >= 0) { List<FileBean> list = new ArrayList<FileBean>(); for (int i = 0; i < ls.size(); i++) { LsEntry f = (LsEntry) ls.get(i); String nm = f.getFilename(); if (nm.equals(".") || nm.equals("..")) continue; SftpATTRS attr = f.getAttrs(); FileBean fileBean=new FileBean(); if (attr.isDir()) { fileBean.setDir(true); } else { fileBean.setDir(false); } fileBean.setAttrs(attr); fileBean.setFilePath(dir); fileBean.setFileName(nm); list.add(fileBean); } return list; } return null; }
/** * Determines whether a directory exists or not * 如果是文件,也会抛出异常,返回 false * * @param remoteDirectoryPath * @return true if exists, false otherwise * @throws IOException thrown if any I/O error occurred. */ @Override public boolean existsDirectory(String remoteDirectoryPath) { try { // System.out.println(channel.realpath(remoteFilePath)); SftpATTRS attrs = channel.stat(remoteDirectoryPath); return attrs.isDir(); } catch (SftpException e) { // e.printStackTrace(); return false; } // String originalWorkingDirectory = getWorkingDirectory(); // try { // changeDirectory(remoteDirectoryPath); // } catch (FtpException e) { // //文件夹不存在,会抛出异常。 // return false; // } // //恢复 ftpClient 当前工作目录属性 // changeDirectory(originalWorkingDirectory); // return true; }
@Before public void setUp() throws Exception { classpathService = new ClasspathService(project); hostFiles = Arrays.asList(jar1, jar2, output); when(jar1.getName()).thenReturn(JAR1_NAME); when(jar1.lastModified()).thenReturn(JAR1_LAST_MODIFIED); when(jar1.length()).thenReturn(JAR1_SIZE); when(jar2.getName()).thenReturn(JAR2_NAME); when(jar2.length()).thenReturn(JAR2_SIZE); when(jar2.lastModified()).thenReturn(JAR2_LAST_MODIFIED); when(output.getName()).thenReturn("untitledproject"); when(jar1Server.getFilename()).thenReturn(JAR1_NAME); when(jar2Server.getFilename()).thenReturn(JAR2_NAME); when(jar1Server.getAttrs()).thenReturn(mock(SftpATTRS.class)); when(jar2Server.getAttrs()).thenReturn(mock(SftpATTRS.class)); Vector vector = new Vector(); vector.add(jar1Server); vector.add(jar2Server); when(target.getAlreadyDeployedLibraries()).thenReturn(vector); }
/** * Delete directory and its content recursively. * * @param channel * open channel to SFTP server * @param path * path of the directory * @throws SftpException * when something went wrong */ @SuppressWarnings("unchecked") private void traverse(ChannelSftp channel, String path) throws SftpException { SftpATTRS attrs = channel.stat(path); if (attrs.isDir()) { Vector<LsEntry> files = channel.ls(path); if (files != null && files.size() > 0) { Iterator<LsEntry> it = files.iterator(); while (it.hasNext()) { LsEntry entry = it.next(); if ((!entry.getFilename().equals(".")) && (!entry.getFilename().equals(".."))) { traverse(channel, path + "/" + entry.getFilename()); } } } channel.rmdir(path); } else { channel.rm(path); } }
@Override public void put(FileAttrs file, InputStream in) throws Throwable { String path = file.path(); if (file.isDirectory()) { mkdirs(this.channel, path, preserve() ? file.mode() : null, preserve() ? file.mtime() : null); } else { String parent = PathUtils.getParent(path); if (parent != null && !exists(this.channel, parent)) { mkdirs(this.channel, parent, null, null); } this.channel.put(in, path, null, com.jcraft.jsch.ChannelSftp.OVERWRITE); if (preserve()) { // TODO test SftpATTRS attrs = this.channel.stat(path); attrs.setPERMISSIONS(file.mode()); attrs.setACMODTIME(file.atime(), file.mtime()); this.channel.setStat(path, attrs); } } }
/** * This method is similar to getResource, except that the returned resource is fully initialized * (resolved in the sftp repository), and that the given string is a full remote path * * @param path * the full remote path in the repository of the resource * @return a fully initialized resource, able to answer to all its methods without needing any * further connection */ @SuppressWarnings("unchecked") public Resource resolveResource(String path) { try { List<LsEntry> r = getSftpChannel(path).ls(getPath(path)); if (r != null) { SftpATTRS attrs = r.get(0).getAttrs(); return new BasicResource(path, true, attrs.getSize(), attrs.getMTime() * MILLIS_PER_SECOND, false); } } catch (Exception e) { Message.debug("Error while resolving resource " + path, e); // silent fail, return nonexistent resource } return new BasicResource(path, false, 0, 0, false); }
@Override protected void execute() throws SftpResult, JSchException { ChannelSftp ch = channel(); try { SftpATTRS attrs = ch.stat(path); throw new SftpResult(attrs); } catch (SftpException e) { if (e.id == SSH_FX_NO_SUCH_FILE) { throw new SftpResult(null); } else { throw new SftpError(e, "Error checking stat of %s", path); } } finally { release(ch); } }
public FileType getFileType(String filename) throws KettleJobException { try { SftpATTRS attrs=c.stat(filename); if (attrs == null) return FileType.IMAGINARY; if ((attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS) == 0) throw new KettleJobException("Unknown permissions error"); if (attrs.isDir()) return FileType.FOLDER; else return FileType.FILE; } catch (Exception e) { throw new KettleJobException(e); } }
public boolean folderExists(String foldername) { boolean retval =false; try { SftpATTRS attrs=c.stat(foldername); if (attrs == null) return false; if ((attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS) == 0) throw new KettleJobException("Unknown permissions error"); retval=attrs.isDir(); } catch (Exception e) { // Folder can not be found! } return retval; }
public void setSftpAttrs(String path, boolean isDir, SftpATTRS attrs) throws VrsException { try { synchronized (serverMutex) { checkState(); sftpChannel.setStat(path, attrs); } } catch (SftpException e) { // find out what is wrong: if (this.existsPath(path, isDir) == false) { // Error Handling: return better Exception throw new ResourceNotFoundException("Path doesn't exists:" + path); } else { throw convertException(e); } } }
public boolean isLink(String path) throws VrsException { SftpATTRS attrs = getSftpAttrs(path); boolean val = attrs.isLink(); if (val) { String strs[] = attrs.getExtended(); if (strs != null) { int i = 0; for (String str : strs) { System.err.println("" + (i++) + ":" + str); } } } return val; }
public FileType getFileType( String filename ) throws KettleJobException { try { SftpATTRS attrs = c.stat( filename ); if ( attrs == null ) { return FileType.IMAGINARY; } if ( ( attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS ) == 0 ) { throw new KettleJobException( "Unknown permissions error" ); } if ( attrs.isDir() ) { return FileType.FOLDER; } else { return FileType.FILE; } } catch ( Exception e ) { throw new KettleJobException( e ); } }
public boolean folderExists( String foldername ) { boolean retval = false; try { SftpATTRS attrs = c.stat( foldername ); if ( attrs == null ) { return false; } if ( ( attrs.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_PERMISSIONS ) == 0 ) { throw new KettleJobException( "Unknown permissions error" ); } retval = attrs.isDir(); } catch ( Exception e ) { // Folder can not be found! } return retval; }
public ExternalResourceMetaData getMetaData(URI uri, boolean revalidate) { LockableSftpClient sftpClient = sftpClientFactory.createSftpClient(uri, credentials); try { SftpATTRS attributes = sftpClient.getSftpClient().lstat(uri.getPath()); return attributes != null ? toMetaData(uri, attributes) : null; } catch (com.jcraft.jsch.SftpException e) { if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { return null; } throw ResourceExceptions.getFailed(uri, e); } finally { sftpClientFactory.releaseSftpClient(sftpClient); } }
private ExternalResourceMetaData toMetaData(URI uri, SftpATTRS attributes) { long lastModified = -1; long contentLength = -1; if ((attributes.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_ACMODTIME) != 0) { lastModified = attributes.getMTime() * 1000; } if ((attributes.getFlags() & SftpATTRS.SSH_FILEXFER_ATTR_SIZE) != 0) { contentLength = attributes.getSize(); } return new DefaultExternalResourceMetaData(uri, lastModified, contentLength); }
private void setFromAttrs(FileEntry fileEntry, SftpATTRS attrs) { fileEntry.isDirectory = attrs.isDir(); fileEntry.canRead = true; // currently not inferred from the // permissions. fileEntry.canWrite = true; // currently not inferred from the // permissions. fileEntry.lastModifiedTime = ((long) attrs.getMTime()) * 1000; if (fileEntry.isDirectory) fileEntry.sizeInBytes = 0; else fileEntry.sizeInBytes = attrs.getSize(); }
private List<FileEntry> listFiles(String path, ChannelSftp c) throws Exception { try { List<FileEntry> res = new ArrayList<FileEntry>(); @SuppressWarnings("rawtypes") java.util.Vector vv = c.ls(extractSessionPath(path)); if (vv != null) { for (int ii = 0; ii < vv.size(); ii++) { Object obj = vv.elementAt(ii); if (obj instanceof com.jcraft.jsch.ChannelSftp.LsEntry) { LsEntry lsEntry = (com.jcraft.jsch.ChannelSftp.LsEntry) obj; if ((lsEntry.getFilename().equals(".")) ||(lsEntry.getFilename().equals("..")) ) continue; FileEntry fileEntry = new FileEntry(); fileEntry.displayName = lsEntry.getFilename(); fileEntry.path = createFilePath(path, fileEntry.displayName); SftpATTRS attrs = lsEntry.getAttrs(); setFromAttrs(fileEntry, attrs); res.add(fileEntry); } } } return res; } catch (Exception e) { tryDisconnect(c); throw convertException(e); } }
public boolean isDir(String targetDir) throws SftpException { try { SftpATTRS attrs = channelSftp.stat(targetDir); return attrs.isDir(); } catch (SftpException sftpException) { return false; } }
/** * Determines whether a file exists or not * 如果是文件夹,返回 false * * @param remoteFilePath * @return true if exists, false otherwise * @throws IOException thrown if any I/O error occurred. */ @Override public boolean existsFile(String remoteFilePath) { try { // System.out.println(channel.realpath(remoteFilePath)); SftpATTRS attrs = channel.stat(remoteFilePath); return attrs.isReg(); } catch (SftpException e) { e.printStackTrace(); return false; } // try { // // ls 命令 // // 如果是文件夹或文件夹的符号链接,会进入该文件夹,进行列表,则文件个数会大于 1 // // 如果是文件,则只会返回该文件本身,文件个数 =1 // Vector<LsEntry> lsEntries = channel.ls(remoteFilePath); // // for(LsEntry entry:lsEntries) // System.out.println(entry.getFilename()); // // return lsEntries.size() == 1; // } catch (SftpException e) { // e.printStackTrace(); // return false; // } }
/** * This method returns the file attributes of the remote file. * * @param session JSch session * @param remoteFile Absolute path of the remote file * @return SftpATTRS object that contains the file attributes * @throws JSchException * @throws SftpException */ public static SftpATTRS lstat( Session session, String remoteFile ) throws JSchException, SftpException { ChannelSftp sftpChannel = (ChannelSftp) session.openChannel( "sftp" ); sftpChannel.connect(); SftpATTRS fileStat = sftpChannel.lstat( remoteFile ); sftpChannel.disconnect(); return fileStat; }