From 787c1a29d178a26af3094f0dc0bd9f7ab4538e0d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 30 Jul 2025 06:07:01 +0000 Subject: [PATCH] Migrate FileOptics from .NET to Rust, update CI/CD and project structure Co-authored-by: kylewrader --- .editorconfig | 3 - .github/workflows/ci.yml | 70 ++-- .gitignore | 444 +--------------------- FileOptics.sln | 37 -- FileOptics/Cli.cs | 50 --- FileOptics/FileOptics.csproj | 23 -- FileOptics/HexWriter.cs | 159 -------- FileOptics/Program.cs | 53 --- FileOptics/Properties/launchSettings.json | 8 - README.md | 24 +- fo.cmd | 2 - 11 files changed, 65 insertions(+), 808 deletions(-) delete mode 100644 FileOptics.sln delete mode 100644 FileOptics/Cli.cs delete mode 100644 FileOptics/FileOptics.csproj delete mode 100644 FileOptics/HexWriter.cs delete mode 100644 FileOptics/Program.cs delete mode 100644 FileOptics/Properties/launchSettings.json delete mode 100644 fo.cmd diff --git a/.editorconfig b/.editorconfig index 344e23d..c8058c3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,3 @@ -[*.sln] -end_of_line = crlf - [*] end_of_line = lf charset = utf-8 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a27e436..8adb5d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,48 +17,48 @@ jobs: steps: - name: Clone - uses: actions/checkout@v2 + uses: actions/checkout@v4 - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 + - name: Setup Rust + uses: actions-rs/toolchain@v1 with: - dotnet-version: 5.0.201 + toolchain: stable + override: true + components: rustfmt, clippy - - name: Restore - run: dotnet restore + - name: Cache cargo registry + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - - name: Build - run: dotnet build --configuration Release --no-restore + - name: Cache cargo index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }} - - name: Unit Test - run: dotnet test --no-restore --verbosity normal + - name: Cache cargo build + uses: actions/cache@v3 + with: + path: target + key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - - name: Package - run: dotnet pack -c release FileOptics/FileOptics.csproj + - name: Check formatting + run: cargo fmt -- --check - - name: Upload artifact from ubuntu - uses: actions/upload-artifact@v2 - with: - name: package-${{matrix.os}} - path: "*.nupkg" + - name: Run clippy + run: cargo clippy -- -D warnings - publish: - if: startswith(github.ref, 'refs/heads/master') - needs: build - runs-on: ubuntu-latest - steps: - - name: Download artifact - uses: actions/download-artifact@v2 - with: - name: package-ubuntu-latest + - name: Build + run: cargo build --release - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 3.1.402 + - name: Run tests + run: cargo test - - name: Publish - env: - FEED: "https://api.nuget.org/v3/index.json" - NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} - run: dotnet nuget push FileOptics*.nupkg --api-key "$NUGET_API_KEY" --source "$FEED" + - name: Upload artifact from ubuntu + if: matrix.os == 'ubuntu-latest' + uses: actions/upload-artifact@v3 + with: + name: file_optics-${{ matrix.os }} + path: target/release/file_optics diff --git a/.gitignore b/.gitignore index 2b3bec4..74f5a86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,438 +1,16 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# Rust +/target/ +Cargo.lock -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- Backup*.rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -## -## Visual studio for Mac -## - - -# globs -Makefile.in -*.userprefs -*.usertasks -config.make -config.status -aclocal.m4 -install-sh -autom4te.cache/ -*.tar.gz -tarballs/ -test-results/ - -# Mac bundle stuff -*.dmg -*.app +# IDE +.vscode/ +.idea/ +*.swp +*.swo -# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore -# General +# OS .DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore -# Windows thumbnail cache files Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -# JetBrains Rider -.idea/ -*.sln.iml - -## -## Visual Studio Code -## -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - - -# Added by cargo - -/target +# Logs +*.log diff --git a/FileOptics.sln b/FileOptics.sln deleted file mode 100644 index 4ac8a66..0000000 --- a/FileOptics.sln +++ /dev/null @@ -1,37 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29102.190 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileOptics", "FileOptics\FileOptics.csproj", "{1B011BE1-FD17-4B3F-AC31-254CC2208806}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|x64.ActiveCfg = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|x64.Build.0 = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|x86.ActiveCfg = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Debug|x86.Build.0 = Debug|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|Any CPU.Build.0 = Release|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|x64.ActiveCfg = Release|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|x64.Build.0 = Release|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|x86.ActiveCfg = Release|Any CPU - {1B011BE1-FD17-4B3F-AC31-254CC2208806}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B882925C-6E69-4FBE-B7C9-58A070D82308} - EndGlobalSection -EndGlobal diff --git a/FileOptics/Cli.cs b/FileOptics/Cli.cs deleted file mode 100644 index e8e71e9..0000000 --- a/FileOptics/Cli.cs +++ /dev/null @@ -1,50 +0,0 @@ -using McMaster.Extensions.CommandLineUtils; -using System; -using System.ComponentModel.DataAnnotations; - -namespace FileOptics -{ - [Command( - Name = "fo", - FullName = "FileOptics", - Description = "A file inspector application")] - class Cli - { - [Argument(0, - Name = "FILE", - Description = "The relative or absolute path to the file you want optics into.\n")] - [Required] - [FileExists] - string File { get; set; } - - [Option("-r|--readable-lines", - CommandOptionType.NoValue, - Description = "Print readable lines under hex values.\n Default: false\n")] - bool ReadableLines { get; set; } = false; - - [Option("-s|--sep ", - CommandOptionType.SingleValue, - Description = "The amount of spaces to separator each hex value by.\n Default: 1\n")] - int SeparatorLength { get; set; } = 1; - - [Option("--no-bom", - CommandOptionType.NoValue, - Description = "Skip printing BOM (byte order mark) info.")] - bool SkipBom { get; set; } = false; - - int OnExecute(HexWriter hexWriter, IConsole console) - { - try - { - hexWriter.Write(File, ReadableLines, SeparatorLength, printBom: !SkipBom); - } - catch (Exception ex) - { - console.Error.WriteLine(ex.Message); - console.Error.WriteLine(ex.StackTrace); - return 1; - } - return 0; - } - } -} diff --git a/FileOptics/FileOptics.csproj b/FileOptics/FileOptics.csproj deleted file mode 100644 index ae62961..0000000 --- a/FileOptics/FileOptics.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - FileOptics - FileOptics - 0.5.0 - Kyle W. Rader - A command line hex file reader - - Exe - net5.0 - - true - ../ - fo - - - - - - - - diff --git a/FileOptics/HexWriter.cs b/FileOptics/HexWriter.cs deleted file mode 100644 index 2f01e02..0000000 --- a/FileOptics/HexWriter.cs +++ /dev/null @@ -1,159 +0,0 @@ -using McMaster.Extensions.CommandLineUtils; -using System.Collections.Generic; -using System.IO; -using System.IO.Abstractions; -using System.Linq; -using System.Text; - -namespace FileOptics -{ - class HexWriter - { - private readonly IConsole console; - private readonly IFileSystem fs; - private string sep; - private bool withReadableLine; - private int lineNumber = 0; - private string lineNumberHeader = string.Empty; - private readonly StringBuilder sb = new StringBuilder(); - private int value; - private readonly IList values = new List(); - - const int LineFeed = 0x0a; - const int CarriageReturn = 0x0d; - const string NonPrintable = "NP"; - - IDictionary printAs = new Dictionary() - { - {LineFeed, "\\n" }, - {CarriageReturn, "\\r" }, - }; - - public HexWriter(IConsole console, IFileSystem fs) - { - this.console = console; - this.fs = fs; - } - - public void Write(string file, bool withReadableLine, int sepSpace, bool printBom) - { - this.sep = new string(' ', sepSpace); - this.withReadableLine = withReadableLine; - - console.WriteLine($"File: {file}\n"); - - using (var reader = fs.File.OpenRead(file)) - { - CheckBom(reader, printBom); - while ((value = reader.ReadByte()) != -1) - { - if (values.Count == 0) - { - lineNumberHeader = string.Format("{0,-4:d}: ", lineNumber++); - sb.Append(lineNumberHeader); - } - - values.Add(value); - sb.AppendFormat("{0,2:X2}", value); - - if (value == LineFeed) - { - PrintLine(); - } - else - { - sb.Append(sep); - } - } - - if (values.Count > 0) - { - PrintLine(); - } - } - } - - private void CheckBom(Stream reader, bool print) - { - int[] bom = new int[3]; - for (var i = 0; i < 3; i++) - { - bom[i] = reader.ReadByte(); - } - string message = string.Empty; - - if (bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF) - { - message = string.Format("{0:X2} {1:X2} {2:X2} (UTF-8 BOM)", bom[0], bom[1], bom[2]); - } - else if (bom[0] == 0xFE && bom[1] == 0xFF) - { - message = string.Format("{0:X2} {1:X2} (UTF-16 Big Endian BOM)", bom[0], bom[1]); - reader.Seek(-1, SeekOrigin.Current); // Seek back 1 byte - } - else if (bom[0] == 0xFF && bom[1] == 0xFE) - { - message = string.Format("{0:X2} {1:X2} (UTF-16 Little Endian BOM)", bom[0], bom[1]); - reader.Seek(-1, SeekOrigin.Current); // Seek back 1 byte - } - else - { - // Reset at start of stream. - message = "No visible BOM"; - reader.Seek(0, SeekOrigin.Begin); - } - if (print) - { - console.WriteLine(message); - } - } - - void PrintLine() - { - console.WriteLine(sb.ToString()); - sb.Clear(); - - if (withReadableLine) - { - console.WriteLine(ReadableLine(values, lineNumberHeader.Length)); - } - - values.Clear(); - } - - string ReadableLine(IList values, int pad) - { - var sb = new StringBuilder(); - sb.Append(new string(' ', pad)); - foreach (var val in values) - { - sb.AppendFormat("{0,2:s}{1:s}", ByteAsString(val), sep); - } - return sb.ToString(); - } - - string ByteAsString(int value) - { - if (printAs.ContainsKey(value)) { return printAs[value]; } - - char c = (char)value; - bool normal = new[] - { - char.IsLetterOrDigit(c), - char.IsPunctuation(c), - char.IsWhiteSpace(c), - }.Any(); - - if (normal) - { - return c.ToString(); - } - else if (char.IsSeparator(c)) - { - return char.GetUnicodeCategory(c).ToString(); - } - return NonPrintable; - } - - } -} diff --git a/FileOptics/Program.cs b/FileOptics/Program.cs deleted file mode 100644 index 795c25d..0000000 --- a/FileOptics/Program.cs +++ /dev/null @@ -1,53 +0,0 @@ -using McMaster.Extensions.CommandLineUtils; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Diagnostics; -using System.IO.Abstractions; -using System.Reflection; - -namespace FileOptics -{ - class Program - { - static int Main(string[] args) - { - try - { - int returnCode = BuildApp().Execute(args); - Environment.Exit(returnCode); - return returnCode; - } - catch (UnrecognizedCommandParsingException ex) - { - Console.Error.WriteLine(ex.Message); - return 1; - } - } - - static CommandLineApplication BuildApp() - { - var app = new CommandLineApplication(); - app.HelpOption("-h|--help"); - app.VersionOption("-v|--version", GetVersion()); - app.Conventions - .UseConstructorInjection(Services()) - .UseDefaultConventions(); - return app; - } - - static string GetVersion() - { - Assembly assembly = Assembly.GetExecutingAssembly(); - return FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion; - } - - static IServiceProvider Services() - { - return new ServiceCollection() - .AddSingleton() - .AddSingleton(PhysicalConsole.Singleton) - .AddTransient() - .BuildServiceProvider(); - } - } -} diff --git a/FileOptics/Properties/launchSettings.json b/FileOptics/Properties/launchSettings.json deleted file mode 100644 index 66c0edc..0000000 --- a/FileOptics/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "FileOptics": { - "commandName": "Project", - "commandLineArgs": "azure-pipelines.yml -r" - } - } -} \ No newline at end of file diff --git a/README.md b/README.md index f3820b9..5ad3644 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,31 @@ This is a command line interface (cli) for looking at files and their bytes. ## Installation -This tool requires the [`dotnet` cli tool](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/install) (version >= `5.0.201`) be installed. +### From Source +This tool requires [Rust](https://rustup.rs/) to be installed. + +```bash +git clone +cd file-optics +cargo build --release ``` -dotnet tool install -g FileOptics + +The binary will be available at `target/release/file_optics`. + +### Using Cargo + +```bash +cargo install --path . ``` -The tool will install globally and be accessible as `fo` on your command line. +The tool will install and be accessible as `file_optics` on your command line. ## Usage To get help run -``` -fo -h | --help +```bash +file_optics -h +# or +file_optics --help ``` diff --git a/fo.cmd b/fo.cmd deleted file mode 100644 index 1192b49..0000000 --- a/fo.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -dotnet run -p FileOptics\FileOptics.csproj -- %* \ No newline at end of file