More .NET components

Directory operations

Working with current directory #

To get current directory, use GetCurrentDirectory method. To change it, use ChangeDirectory method.

CSharp

// set current directory
sftp.ChangeDirectory("/MyData");

// display the current directory to the user
string currentDir = sftp.GetCurrentDirectory();
Console.WriteLine("Current directory changed to: {0}", currentDir);

VisualBasic

' set current directory
sftp.ChangeDirectory("/MyData")

' display the current directory to the user
Dim currentDir As String = sftp.GetCurrentDirectory()
Console.WriteLine("Current directory changed to: {0}", currentDir)

The SFTP protocol itself doesn't have a concept of current directory. However, Rebex SFTP emulates it, making it possible to change the current directories and use both absolute and relative paths.

Listing directory content #

To retrieve listings of directory content, three methods are available:

  • GetList - returns collection of SftpItem objects
  • GetNameList - returns a String array of item names
  • GetRawList - returns a String array of item information in Unix-like format (see more)

All these methods accept an optional argument which represents a path and/or a mask (wildcard pattern).

CSharp

// get items within the current directory
SftpItemCollection currentItems = sftp.GetList();

// get names of items within "/MyData
string[] dataItems = sftp.GetNameList("/MyData");

// get unix-like listing of all ".txt" files in "/MyData"
string[] dataTextFiles = sftp.GetRawList("/MyData/*.txt");

VisualBasic

' get items within the current directory
Dim currentItems As SftpItemCollection = sftp.GetList()

' get names of items within "/MyData
Dim dataItems As String() = sftp.GetNameList("/MyData")

' get unix-like listing of all ".txt" files in "/MyData"
Dim dataTextFiles As String() = sftp.GetRawList("/MyData/*.txt")
Tip: To retrieve listing of items in subdirectories as well, use a more powerful GetItems method.

Listing directory content - recursively #

To retrieve a listing of directory content including items in subdirectories, or to use more complex filtering criteria, use GetItems method.

Tip: For more information on wildcards, traversal modes and file sets, see wildcards and TraversalMode and Rebex.IO.FileSet features.

CSharp

SftpItemCollection items;

// get all items of current directory recursively
// (items from subdirectories are returned as well)
items = sftp.GetItems("*");

// get all ".txt" files of "/MyData" directory only
// (files from subdirectories are not returned)
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesShallow);

// get all ".txt" files under "/MyData" directory
// (files from subdirectories are returned as well)
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesDeep);

// initialize a file set
var fileSet = new Rebex.IO.FileSet("/MyData");
fileSet.Include("Web");
fileSet.Exclude("Web/Images");

// get all items defined by the file set
items = sftp.GetItems(fileSet);

VisualBasic

Dim items As SftpItemCollection

' get all items of current directory recursively
' (items from subdirectories are returned as well)
items = sftp.GetItems("*")

' get all ".txt" files of "/MyData" directory only
' (files from subdirectories are not returned)
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesShallow)

' get all ".txt" files under "/MyData" directory
' (files from subdirectories are returned as well)
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesDeep)

' initialize a file set
Dim fileSet = New Rebex.IO.FileSet("/MyData")
fileSet.Include("Web")
fileSet.Exclude("Web/Images")

' get all items defined by the file set
items = sftp.GetItems(fileSet)

Listing directory content - on the fly #

All item listing methods raise a ListItemReceived event when an item is received. This is very useful when working with huge directory listings because it makes it possible to display items as they arrive. It also makes it possible to filter item listings using any custom criteria (such as last write time).

Custom item listing filter implementation:

CSharp

void client_ListItemReceived(object sender, SftpListItemReceivedEventArgs e)
{
    // ignore ale items older than 7 days
    if (e.Item.LastWriteTime < DateTime.Now.Date.AddDays(-7))
        e.Ignore();
}

VisualBasic

Sub client_ListItemReceived(ByVal sender As Object, ByVal e As SftpListItemReceivedEventArgs)
    ' ignore ale items older than 7 days
    If e.Item.LastWriteTime < DateTime.Now.Date.AddDays(-7) Then
        e.Ignore()
    End If
End Sub

Registering the event handler:

CSharp

// register ListItemReceived event handler which is raised
// when an item description is received from the server
sftp.ListItemReceived += client_ListItemReceived;

// get items of current directory filtered by the event handler
SftpItemCollection items = sftp.GetList();

VisualBasic

' register ListItemReceived event handler which is raised
' when an item description is received from the server
AddHandler sftp.ListItemReceived, AddressOf client_ListItemReceived

' get items of current directory filtered by the event handler
Dim items As SftpItemCollection = sftp.GetList()

Getting raw directory listing #

The GetRawList method provides a list of files and directories in a raw Unix-like text format
(similar to "ls -l" command and server-dependent):

-rw-r--r--    1 tester0  tester0        17 May 16 15:00 file.pdf
drwxr-xr-x    2 tester0  tester0      4096 May 16 15:00 Web
-rw-r--r--    1 tester0  tester0        17 May 16 15:00 file.txt

CSharp

// get unix-like listing of items within the current directory
string[] currentItems = sftp.GetRawList();

// get unix-like listing of text files within the specified directory
string[] textFiles = sftp.GetRawList("/MyData/*.txt");

// simply print the directory listing
Console.WriteLine(string.Join("\r\n", currentItems));

VisualBasic

' get unix-like listing of items within the current directory
Dim currentItems As String() = sftp.GetRawList()

' get unix-like listing of text files within the specified directory
Dim textFiles As String() = sftp.GetRawList("/MyData/*.txt")

' simply print the directory listing
Console.WriteLine(String.Join(vbCrLf, currentItems))
Note: Although raw listings are only supported in SFTP protocol v3, Rebex SFTP emulates it when using SFTP v4 as well.

Finding files #

To find a file or multiple files on the remote host, use GetList and GetItems methods. The GetList method only searching in one particular folder, while GetItems method can search its subfolders as well:

CSharp

SftpItemCollection items;

// find all "*.txt" files in "/MyData" directory only
items = sftp.GetList("/MyData/*.txt");

// find all "*.txt" files in "/MyData" directory and its subdirectories
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesDeep);

VisualBasic

Dim items As SftpItemCollection

' find all "*.txt" files in "/MyData" directory only
items = sftp.GetList("/MyData/*.txt")

' find all "*.txt" files in "/MyData" directory and its subdirectories
items = sftp.GetItems("/MyData/*.txt", TraversalMode.MatchFilesDeep)

Creating a directory #

To create a new remote directory, use CreateDirectory method. It returns the absolute path of the newly created directory.

CSharp

// create new remote directory
string newDir = sftp.CreateDirectory("/MyData/Exports");

// notify the user
Console.WriteLine("New directory created: {0}", newDir);

VisualBasic

' create new directory
Dim newDir As String = sftp.CreateDirectory("/MyData/Exports")

' notify the user
Console.WriteLine("New directory created: {0}", newDir)

Deleting a directory #

To delete an empty remote directory, use RemoveDirectory method.

Tip: To delete non-empty directories, use Delete method instead.

CSharp

// delete remote directory if it doesn't exist locally
if (!Directory.Exists(@"C:\MyData\Exports"))
{
    // fails if not empty
    sftp.RemoveDirectory("/MyData/Exports");

    // notify the user
    // ...
}

VisualBasic

' delete remote directory if it doesn't exist locally
If Not Directory.Exists("C:\MyData\Exports") Then
    ' fails if not empty
    sftp.RemoveDirectory("/MyData/Exports")

    ' notify the user
    ' ...
End If

Deleting directories recursively #

To delete non-empty remote directory or multiple files, use Delete method. Be careful - this is a very powerful method.

CSharp

// delete whole remote directory
// (deletes "/MyData/Temp" directory itself as well)
sftp.Delete("/MyData/Temp", TraversalMode.Recursive);

// delete content of remote directory
// (keep "/MyData" directory itself)
sftp.Delete("/MyData/*", TraversalMode.Recursive);

// delete all ".txt" files in "/MyData"
sftp.Delete("/MyData/*.txt", TraversalMode.MatchFilesShallow);

VisualBasic

' delete whole remote directory
' (deletes "/MyData/Temp" directory itself as well)
sftp.Delete("/MyData/Temp", TraversalMode.Recursive)

' delete content of remote directory
' (keep "/MyData" directory itself)
sftp.Delete("/MyData/*", TraversalMode.Recursive)

' delete all ".txt" files in "/MyData"
sftp.Delete("/MyData/*.txt", TraversalMode.MatchFilesShallow)

Renaming/moving a directory #

To rename a directory, use Rename method. It can be used for moving a remote directory to another location at the server as well.

CSharp

// rename a remote directory
sftp.Rename("/MyData/A", "/MyData/B");

// move a remote directory
sftp.Rename("/MyData/Exports", "/Backups/Exports");

VisualBasic

' rename a remote directory
sftp.Rename("/MyData/A", "/MyData/B")

' move a remote directory
sftp.Rename("/MyData/Exports", "/Backups/Exports")

Tip: For moving directories between a client and a server, use Upload or Download methods with TransferMethod.Move argument.

Checking directory existence #

To check whether a remote directory already exists, use DirectoryExists method.

CSharp

// check whether a remote directory exists
bool exists = sftp.DirectoryExists("/MyData/Exports");

if (exists)
{
    // prompt the user
    // ...
}

VisualBasic

' check whether a remote directory exists
Dim exists = sftp.DirectoryExists("/MyData/Exports")

If exists Then
    ' prompt the user
    ' ...
End If

Sorting directory content #

GetList and GetItems methods return directory items in the same order as returned by the server, which often means no sorting at all. To sort the items, use SftpItemCollection's Sort method and FileSystemItemComparer object.

For more sorting options, see FileSystemItemComparerType enum.

CSharp

// get items in the current directory
SftpItemCollection items = sftp.GetList();

// example 1: large files first
items.Sort(new FileSystemItemComparer(FileSystemItemComparerType.Length));

// example 2: order by multiple fields
// (directories first, then order by file name)
items.Sort(new MultiComparer(
        new FileSystemItemComparer(FileSystemItemComparerType.FileType),
        new FileSystemItemComparer(FileSystemItemComparerType.Name)));

VisualBasic

' get items in the current directory
Dim items As SftpItemCollection = sftp.GetList()

' example 1: large files first
items.Sort(New FileSystemItemComparer(FileSystemItemComparerType.Length))

' example 2: order by multiple fields
' (directories first, then order by file name)
items.Sort(New MultiComparer(
        New FileSystemItemComparer(FileSystemItemComparerType.FileType),
        New FileSystemItemComparer(FileSystemItemComparerType.Name)))

LINQ support - IEnumerable<T> collection #

The SftpItemCollection object returned by GetList and GetItems methods implements IEnumerable<SftpItem> to support LINQ queries:

As it implements IEnumerable<FileSystemItem> as well (part of common SFTP and FTP API), casting it explicitly to IEnumerable<SftpItem> might be necessary in order to use the proper LINQ extension methods. You can achieve this by calling Cast<SftpItem> method.

CSharp

DateTime dt = DateTime.Now.Date.AddDays(-7);

// get all ".txt" files not older than 7 days sorted by path
// from current directory using LINQ
var files1 =
    sftp.GetList("*.txt").Cast<SftpItem>().
    Where(item => item.IsFile && item.LastWriteTime > dt).
    OrderBy(item => item.Path);

// get all ".txt" files not older than 7 days sorted by path
// anywhere under current directory using LINQ to SQL
var items = sftp.GetItems("*.txt", TraversalMode.MatchFilesDeep);
var files2 =
    from SftpItem item in items
    where item.IsFile && item.LastWriteTime > dt
    orderby item.Path
    select item;

VisualBasic

Dim dt = DateTime.Now.Date.AddDays(-7)

' get all ".txt" files not older than 7 days sorted by path
' from current directory using LINQ
Dim files1 =
    sftp.GetList("*.txt").Cast(Of SftpItem).
    Where(Function(item) item.IsFile AndAlso item.LastWriteTime > dt).
    OrderBy(Function(item) item.Path)

' get all ".txt" files not older than 7 days sorted by path
' anywhere under current directory using LINQ to SQL
Dim items = sftp.GetItems("*.txt", TraversalMode.MatchFilesDeep)
Dim files2 =
    From item As SftpItem In items
    Where item.IsFile AndAlso item.LastWriteTime > dt
    Order By item.Path
    Select item