rush
Robbiblubber.Util.FileStorageAdapters.ShellOne shell for multiple filesystems: attach local directories, FTP/FTPS, SSH/SFTP, and SharePoint Online as named storage locations, then use the same commands interactively or in scripts.
Robbiblubber.Util.NETTools for practical .NET tasks: console progress indicators, a common file API for local and remote storage, and PDF text extraction with OCR. rush and PdfText CLI bring these libraries to the command line.
Robbiblubber.Util.FileStorageAdapters.ShellOne shell for multiple filesystems: attach local directories, FTP/FTPS, SSH/SFTP, and SharePoint Online as named storage locations, then use the same commands interactively or in scripts.
Robbiblubber.Util.PdfText.CliPdfText on the command line: xpdf reads a PDF and writes its extracted text to a text file, with an OCR fallback for scanned pages.
The libraries are available as separate NuGet packages. Install the building blocks your project needs.
Progress bars and animated spinners for console applications, with status messages, colours, and customisable appearance.
using Robbiblubber.Util.ConsoleToolkit;
ConsoleProgressBar bar = new() { BarSize = 30, Text = "Processing..." };
bar.Show();
for (int i = 1; i <= 100; i++)
{
await Task.Delay(25);
bar.Value = i;
}
bar.Text = "Done.";
bar.Finish();The example reaches 100% before Finish() completes the display.
dotnet add package Robbiblubber.Util.ConsoleToolkitA common API for files and directories: local storage, FTP/FTPS and SSH/SFTP servers, or SharePoint Online. Copy and move operations also work across adapters.
using Robbiblubber.Util.FileStorageAdapters;
static async Task CopyReportAsync(IAdapter sourceAdapter, IAdapter targetAdapter)
{
IDirectory source = sourceAdapter.OpenDirectory("/documents");
IDirectory target = targetAdapter.OpenDirectory("/incoming");
IFile file = await source.GetFileAsync("report.pdf");
await file.CopyToAsync(target, "report.pdf", overwrite: true);
}With initialised adapters and existing directories: the same transfer code for different storage systems.
dotnet add package Robbiblubber.Util.FileStorageAdaptersUse FTP and FTPS as file storage, including encrypted connections with explicit or implicit TLS.
using Robbiblubber.Util.FileStorageAdapters;
using Robbiblubber.Util.FileStorageAdapters.Ftp;
FtpAdapterOptions options = new() { Security = FtpSecurity.EXPLICIT_TLS };
using FtpAdapter adapter = new(
"ftp.example.org", 21, "username", "password", options);
IDirectory directory = adapter.OpenDirectory("/incoming");Example using explicit TLS. Replace the server, credentials, and existing directory.
dotnet add package Robbiblubber.Util.FileStorageAdapters.FtpAccess the local filesystem through the same interfaces as remote storage, using LfsAdapter for files and directories on the computer.
using Robbiblubber.Util.FileStorageAdapters;
using Robbiblubber.Util.FileStorageAdapters.LocalFileSystem;
IDirectory directory = LfsAdapter.Open("C:/Data");
IFile file = await directory.GetFileAsync("report.pdf");
using Stream stream = await file.ReadAsync();C:/Data and report.pdf must exist. On Linux, use a path such as /var/data.
dotnet add package Robbiblubber.Util.FileStorageAdapters.LocalFileSystemAccess SharePoint Online document libraries as file storage through Microsoft Graph, working with files and folders rather than SharePoint lists.
using Robbiblubber.Util.FileStorageAdapters;
using Robbiblubber.Util.FileStorageAdapters.SharePoint;
SharePointTarget target = SharePointTarget.FromSiteUrl(
"https://tenant.sharepoint.com/sites/project", libraryName: "Documents");
using SharePointAdapter adapter = SharePointAdapter.CreateInteractive(
target, tenantId: "TENANT-ID", clientId: "APPLICATION-ID");
IDirectory directory = adapter.OpenDirectory("/reports");Requires a configured Entra app with suitable permissions. Replace the IDs, library name, and directory.
dotnet add package Robbiblubber.Util.FileStorageAdapters.SharePointTwo access methods in one package: SshAdapter uses remote POSIX shell commands, while SftpAdapter uses the SFTP protocol.
using Robbiblubber.Util.FileStorageAdapters;
using Robbiblubber.Util.FileStorageAdapters.Ssh;
SftpAdapterOptions options = new()
{
HostKeyFingerprint = "SHA256:replace-with-verified-fingerprint"
};
using SftpAdapter adapter = new(
"server.example.org", 22, "username", "password", options);
IDirectory directory = adapter.OpenDirectory("/srv/data");Replace the credentials and path; verify the server fingerprint beforehand and supply it here.
dotnet add package Robbiblubber.Util.FileStorageAdapters.SshExtract text from digital and scanned PDFs: direct text extraction with PdfPig, a Tesseract OCR fallback, and structured table output.
using Robbiblubber.Util.PdfText;
PdfTextExtractor.Options options = new() { Languages = "eng+deu" };
using PdfTextExtractor extractor = new(options);
PdfTextExtractor.Result result = await extractor.GetResultAsync("input.pdf");
await File.WriteAllTextAsync("output.txt", result.Text);This example needs English and German Tesseract language data; the data directory is configurable through TessDataPath.
dotnet add package Robbiblubber.Util.PdfTextThe .NET libraries are distributed through NuGet. Tools and libraries remain grouped in their suites and collections.
View all projects