private List <FileEntry> dir(string fileMask, string uri, int maxNumberOfFiles, ArrayList filesInProcess, bool trace) { try { if (trace) { Trace.WriteLine("[SftpReceiverEndpoint] Dir(" + fileMask + ")"); } List <FileEntry> fileEntries = new List <FileEntry>(); ArrayList checkedOutFiles = new ArrayList(); foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry entry in _sftp.Dir2(fileMask)) { string remotePath = Path.GetDirectoryName(fileMask); long size = entry.getAttrs().getSize(); bool isDirectory = entry.getAttrs().isDir(); string fileName = entry.getFilename(); DateTime fileLastWriten; if (isDirectory || size == 0) { continue; } try { fileLastWriten = DateTime.Parse(entry.getAttrs().getMtimeString()); } catch { fileLastWriten = DateTime.Now.AddMinutes(1); } TimeSpan ts = DateTime.Now.Subtract(fileLastWriten); try { if (ts.TotalSeconds > TOTALTIMEDIFF && !filesInProcess.Contains(CommonFunctions.CombinePath(remotePath, fileName))) { // "Check out" file if UseLoadBalancing == true if (uri != null && !DataBaseHelper.CheckOutFile(uri, System.Environment.MachineName, fileName, trace)) { continue; // loadbalancing==on, checked out failed } else if (uri != null) // loadbalancing==on, checked out succeeded { // Check that file still exists string filePath = fileMask.Substring(0, fileMask.LastIndexOf("/") + 1) + fileName; if (_sftp.Exists(filePath)) { fileEntries.Add(new FileEntry(fileName, size)); } else { DataBaseHelper.CheckInFile(uri, fileName, trace); continue; } } else //No loadbalancing { fileEntries.Add(new FileEntry(fileName, size)); } } } catch { if (uri != null) { DataBaseHelper.CheckInFile(uri, fileName, trace); } } if (fileEntries.Count == maxNumberOfFiles && maxNumberOfFiles > 0) { break; } } if (trace) { Trace.WriteLine(string.Format("[SftpReceiverEndpoint] Found {0} files.", fileEntries.Count)); } return(fileEntries); } catch (Exception ex) { throw new SftpException("Unable to perform directory list at [" + uri + "]", ex); } finally { RaiseOnDisconnect(); } }
/// <summary> /// This method is no longer used, but is left beacuase it might be used in the future. /// Developed to create a more efficient directory listing. By creating a random order of files, /// listing large amount of files from different different BizTalk nodes became more efficient. /// </summary> /// <param name="fileMask"></param> /// <param name="uri"></param> /// <param name="maxNumberOfFiles"></param> /// <param name="filesInProcess"></param> /// <param name="trace"></param> /// <returns></returns> private List <FileEntry> randomDir(string fileMask, string uri, int maxNumberOfFiles, ArrayList filesInProcess, bool trace) { List <FileEntry> fileEntries = new List <FileEntry>(); ArrayList checkedOutFiles = new ArrayList(); string remotePath = string.Empty; long size; bool isDirectory = false; string fileName = string.Empty; DateTime fileLastWriten; int index; TimeSpan ts; try { Tamir.SharpSsh.java.util.Vector entries = _sftp.Dir2(fileMask); System.Random autoRand = new System.Random(); while (entries.Count > 0 && (fileEntries.Count < maxNumberOfFiles || maxNumberOfFiles == 0)) { index = autoRand.Next(entries.Count - 1); Tamir.SharpSsh.jsch.ChannelSftp.LsEntry entry = (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry)entries[index]; remotePath = Path.GetDirectoryName(fileMask); size = entry.getAttrs().getSize(); isDirectory = entry.getAttrs().isDir(); fileName = entry.getFilename(); if (isDirectory) { entries.RemoveAt(index); continue; } try { fileLastWriten = DateTime.Parse(entry.getAttrs().getMtimeString()); } catch { fileLastWriten = DateTime.Now.AddMinutes(1); } ts = DateTime.Now.Subtract(fileLastWriten); try { if (ts.TotalSeconds > TOTALTIMEDIFF && !filesInProcess.Contains(CommonFunctions.CombinePath(remotePath, fileName))) { // "Check out" file if UseLoadBalancing == true if (uri != null && !DataBaseHelper.CheckOutFile(uri, System.Environment.MachineName, fileName, trace)) { entries.RemoveAt(index); continue; } else { // Check that file still exists string filePath = fileMask.Substring(0, fileMask.LastIndexOf("/") + 1) + fileName; if (_sftp.Exists(filePath)) { fileEntries.Add(new FileEntry(fileName, size)); } else { if (uri != null) { DataBaseHelper.CheckInFile(uri, fileName, trace); } } } } } catch { if (uri != null) { DataBaseHelper.CheckInFile(uri, fileName, trace); } } entries.RemoveAt(index); } Trace.WriteLine(string.Format("[SftpReceiverEndpoint] Found {0} files.", fileEntries.Count)); return(fileEntries); } catch (Exception ex) { throw new SftpException("Unable to perform directory list", ex); } finally { RaiseOnDisconnect(); } }
/// <summary> /// This method is no longer used, but is left beacuase it might be used in the future. /// Developed to create a more efficient directory listing. By creating a random order of files, /// listing large amount of files from different different BizTalk nodes became more efficient. /// </summary> /// <param name="fileMask"></param> /// <param name="uri"></param> /// <param name="maxNumberOfFiles"></param> /// <param name="filesInProcess"></param> /// <param name="trace"></param> /// <returns></returns> private List <FileEntry> RandomDir(string fileMask, string uri, int maxNumberOfFiles, ArrayList filesInProcess, bool trace) { List <FileEntry> fileEntries = new List <FileEntry>(); try { var entries = _sftp.ListDirectory(fileMask).ToList(); Random autoRand = new Random(); while (entries.Count > 0 && (fileEntries.Count < maxNumberOfFiles || maxNumberOfFiles == 0)) { var index = autoRand.Next(entries.Count - 1); var entry = entries[index]; var remotePath = Path.GetDirectoryName(fileMask); var size = entry.Attributes.Size; var isDirectory = entry.Attributes.IsDirectory; var fileName = entry.Name; if (isDirectory) { entries.RemoveAt(index); continue; } DateTime fileLastWriten; try { fileLastWriten = entry.Attributes.LastWriteTime; } catch { fileLastWriten = DateTime.Now.AddMinutes(1); } var ts = DateTime.Now.Subtract(fileLastWriten); try { if (ts.TotalSeconds > Totaltimediff && !filesInProcess.Contains(CommonFunctions.CombinePath(remotePath, fileName))) { // "Check out" file if UseLoadBalancing == true if (uri != null && !DataBaseHelper.CheckOutFile(uri, Environment.MachineName, fileName, trace)) { entries.RemoveAt(index); continue; } else { // Check that file still exists string filePath = fileMask.Substring(0, fileMask.LastIndexOf("/") + 1) + fileName; if (_sftp.Exists(filePath)) { fileEntries.Add(new FileEntry(fileName, size)); } else { if (uri != null) { DataBaseHelper.CheckInFile(uri, fileName, trace); } } } } } catch { if (uri != null) { DataBaseHelper.CheckInFile(uri, fileName, trace); } } entries.RemoveAt(index); } Trace.WriteLine(string.Format("[SftpReceiverEndpoint] Found {0} files.", fileEntries.Count)); return(fileEntries); } catch (Exception ex) { throw new SftpException("Unable to perform directory list", ex); } finally { RaiseOnDisconnect(); } }