一个基于现代.NET,Avalonia,Renci.SSH的易于定制的SFTP跨平台客户端
- 纯C#.NET项目,代码完全透明,只有
Renci.SSH相关Sftp相关操作会访问网络. - 不卡,非常异步(哪卡了就提Issue)
- 非常跨平台,Avalonia本身支持的平台应该都可以跨.目前仅开放Windows和安卓2个比较有代表性的.后面慢慢补
- 支持
密码和SSH2种Sftp验证方式.密码/passphrase存储使用各个平台自身的机制产生专用的key进行加密解密存储.当然,也可以自己改. - UI不用被训狗/被瞎指挥/吃大锅饭,想要什么完全可以自己修改axaml定制
- 自己想要一些自用功能在手机上使用但没有一个砖厂,完全可以在这里自己加按钮然后直接C#代码实现(工作里不能这么干,但这里完全可以自由放开写)
- 最上方的连接管理CRUD
- 按钮很直白了,添加连接时点增,下拉选中后可以连,删,改.
- SFTP连接,远端及本地的文件浏览及上传下载
- 包含右键(安卓平台为长按)菜单的上传下载,双击进入文件夹
- 单个拖动到对面区域进行上传/下载,从其他地方拖动到sftp区域批量上传
- 传输进度显示及取消按钮
- Windows
- 在VS中启动项目选.Desktop,点Run
- 需要打包发布的场合,可以对.Desktop项目右键发布,然后根据自己需要点点点.
- Android
- 保证手机打开开发者模式,如果没玩过这些,可以直接问问AI如何打开开发者模式和支持USB调试
- 把手机插上数据线连电脑上,开启USB调试,选文件传输模式(不想连实机的场合可以用模拟器,比如逍遥)
- 在VS中启动项目选.Android,设备选你的设备.然后点Run
- 如果没有看到你的设备,一般是没选文件传输模式或者手机上在让你确认什么东西
- VS偶尔会抽风,设备这里只有个Android Emulator,没啥太好解决办法.可能抽完风就好了.2026这种抽风频率比2022低了
- 坐和放宽,如果过了一会你的手机上此项目成功运行了,说明你做对了.后面再想启动,就直接像其他app一样点图标启动.
- 第一次启动时直接允许访问全体文件和网络权限即可
- Mac
- TODO
- Linux
- TODO
- 目前界面部分是单页内部多层Content堆叠方式,直接一套梭哈全平台.
- 项目关注点不在UI设计上,更多的是关注机制及功能.纯axaml画界面这些事情大家可以按照自己喜好去给自己定制,或者用控件库替换.
- 安卓平台的UI交互没做任何特殊处理,体验只能说是能用.(这应该也比较符合
Avalonia的具有一致的外观和行为的宣传语)后面有时间会针对移动端操作进行单独适配,以及单独做画面. - 如果各位想以此项目为砖场,比划比划怎么用Avalonia在移动端上做出更像人的交互(比如给安卓平台单独重新axaml,
Popup/Dialog等相关机制替换为使用安卓原生等),可以参考后面自己改代码的一些建议一节.
- 安卓等移动端可能额外需要后台传输等机制,否则会被杀,然后就似了.后面有时间会补充.目前轻度传个小文件前台使用问题不大.
- 目前完全没有使用的是流量WIFI等检查,也没写限速等机制,因此尽量在Wifi环境下使用
- C#与安卓的操作部分使用
Mono.Android,不hybirdMaUI.- 对于
Mono.Android,我想正常情况大家应该都是完全不会写.但这个年代完全可以先AI代打然后自己再手动改改错确实可以比较完美地实现.NET与原生安卓的交互(但干这事还是很花时间的,并且跟在桌面上开发调试的体验相比就纯在赤石.赤完了也没钱拿.不是闲的没事干不建议干这种跟AI一起坐牢用C#写一堆Java命名空间的东西在安卓上一直炸然后对自己0提升这种抽象事.(不过对.NET玩家来说可能体验还比用AndroidStudio写原生好点?)hybird MaUI会有更多额外限制还得到处传MaUI的Activity,更赤石,还不如直接看谷歌的安卓文档学学正统安卓的设计) - 如果想单独探索一下用Mono.Android怎么玩,以及可以玩出什么东西,可以参考隔壁项目ItsMyHu.NET,上面会堆一些直接拿想要的权限之后用Mono.Android狂调安卓API能做到的玩法.也可以自己开个Avalonia跨平台项目让AI不用Maui直接用Mono.Android帮你写.
- 对于
- 可能弄些自定义pipeline,比如上传前自动压缩加密,下载后自动解密解压这样?
- 图标是让AI乱画的,后面应该会换
- 项目目前开发时间较短,不想赤石可以养肥再体验.但不抱着当测试的心态轻度使用应该没啥问题.
- 希望完全定制主画面的场合
- 推荐继承
SftpWorkspaceViewModel,随后创建名称匹配(指可以被ViewLocator找到)的axaml,随后在各个平台的ConfigureServices中注册使用的VM.这样这个平台使用的界面就是你的axaml了.例如目前项目的安卓平台这样注册:
于是在安卓平台上被services.AddSingleton<SftpWorkspaceViewModel, SftpWorkspaceForAndroidViewModel>();
ViewLocator定位到的View的名字也就是SftpWorkspaceForAndroid. 目前的SftpWorkspaceForAndroid是一个仅继承SftpWorkspace而无其他内容的类,仅用于偷SftpWorkspace的axaml并且占位. 如果认为自己的画面做的比较有意义,可以提PR加入项目中,项目会支持各个版本的axaml共存,用户可以自己在依赖注入中自己选择各个平台使用的VM来决定使用的View.上面这些也正是MVVM的意义之一. - 推荐继承
- 其他UI交互定制
- 对于
IViewService中的Popup/Dialog等处理,可以自己实现相关Service,并依赖注入指定.内部实现成用Mono.Android直接new安卓原生的这些,或者转发给控件库都可以.
- 对于
- 只是个Sftp客户端,服务器或者其他可以作为Sftp服务端的东西还是自己弄.不会提供这些.
- 如果是希望局域网互传文件,或简单本机硬盘内部TP测试,没有sftp服务端,可以在
docker-desktop里创建个容器挂载个本地目录并开放端口,随后局域网内部连接,然后添加连接信息(名字为foo,密码为pass,端口为2222)即可连接开始使用:
docker run -d --name sftp-server -p 2222:22 -v <你的本地路径>:/home/foo/upload atmoz/sftp foo:pass:1001- 本项目依赖的开源软件包在
Directory.Packages.props中.感谢他们的奉献.