C#怎么操作网络共享文件夹 C#如何访问和操作局域网共享目录中的文件【网络】

尼克

尼克

2026-03-25

1104人浏览

原创

windows下c#访问局域网共享需用unc路径(如@"\servershare"),注意权限、凭据继承、smb版本、文件锁及路径解析五要素,避免directorynotfoundexception等错误。

c#怎么操作网络共享文件夹 c#如何访问和操作局域网共享目录中的文件【网络】

DirectoryInfoFileInfo 直接访问共享路径,但必须带 UNC 前缀

Windows 下 C# 访问局域网共享文件夹,最直接的方式就是把共享路径当成本地路径用——前提是路径格式正确。你不能写 C:share,也不能写 \servershare(缺协议头),得写成 \\server\share 或更稳妥的 \server\share(C# 字符串里反斜杠要转义,实际代码中写两个)。

常见错误现象:DirectoryNotFoundExceptionUnauthorizedAccessException,多数是因为路径拼错、权限没配或当前进程没继承登录凭据。

  • 确保路径以 \\ 开头,比如 new DirectoryInfo(@"\fileserverpublic")
  • 不要尝试用 DriveInfo 查共享盘符——它只管本地物理/映射驱动器,对纯 UNC 无效
  • 如果程序是 Windows 服务,默认运行在 LocalSystem 账户下,它看不到用户登录态的网络凭据,基本必失败
  • 控制台或 WPF 应用跑在当前用户上下文时,只要该用户有共享访问权限,通常能直接通

需要显式认证?用 WNetAddConnection2 挂载临时连接

当目标共享要求特定用户名密码,而当前 Windows 登录账户没权限时,DirectoryInfo 会直接报错。这时得靠 Windows API 主动“连过去”,本质是模拟一次网络驱动器映射(不真占盘符)。

核心是调用 WNetAddConnection2,传入服务器地址、用户名、密码和空盘符(表示不映射为驱动器)。成功后,后续所有对该共享的 .NET IO 操作就自动带上这个凭据上下文。

  • 必须引用 System.Runtime.InteropServices
  • 调用后记得用 WNetCancelConnection2 清理,否则连接残留可能影响下次操作
  • 密码明文传入有风险,生产环境建议用 CredentialCache 或 Windows 凭据管理器配合
  • 注意:.NET Core/.NET 5+ 在非 Windows 平台无法调用此 API,纯跨平台场景得换方案

File.CopyFileStream 写共享目录时卡住或报错 IOException

不是代码写错了,大概率是共享本身设置了“脱机文件”或启用了 SMB 签名强制策略,导致大文件传输中途断连,或者服务器端限制了单次请求大小。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载

典型表现:小文件正常,几百 MB 以上复制到一半抛 IOException: The specified network name is no longer available;或者读取流时 Read 返回值突然变 0,但没到 EOF。

  • 加异常重试逻辑,尤其是针对 IOExceptionUnauthorizedAccessException
  • 避免用 File.Copy 处理大文件,改用分块 FileStream + 缓冲区(如 64KB),并手动控制 Flush() 频率
  • 检查服务器 SMB 版本:Windows Server 2016+ 默认启用 SMB 3.1.1 加密,老客户端(如 .NET Framework 4.6.1 以下)可能握手失败
  • 确认共享权限(Share Permissions)和 NTFS 权限(Security tab)都放开了写入,二者是“与”关系,缺一不可

为什么有时候明明能列目录,却读不了某个文件?

因为共享目录的“列出内容”权限和“读取”权限是分开控制的。NTFS 层面可能给文件单独设了拒绝(Deny)ACE,或者文件被其他进程独占打开(比如 Excel 正在编辑中)。

更隐蔽的情况:共享路径下存在符号链接(symlink)或挂载点(mount point),而当前账户没权限遍历目标路径,DirectoryInfo.GetFiles() 就会静默跳过或抛异常。

  • GetAccessControl() 检查具体文件的 FileSystemAccessRule,别只看父目录
  • 尝试用 Process Explorer 查看文件是否被占用,尤其注意 Office、PDF 阅读器这类常驻后台锁文件的程序
  • UNC 路径下慎用 Path.GetFullPath(),它可能把 \servershare..other 归一化成非法路径,触发访问拒绝
  • 如果涉及中文路径,确认服务器 SMB 设置没禁用 UTF-8 文件名支持(SMB 1.0 默认不支持,容易乱码导致找不到文件)

权限、凭据、SMB 协议版本、文件锁、路径解析——这五个点串起来,基本覆盖了 90% 的共享访问失败原因。调试时别一上来就查代码逻辑,先 telnet 通端口,再用资源管理器手工走一遍路径,比瞎改代码快得多。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1158

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

137

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

Linux man-pages 项目
Linux man-pages 项目

共0课时 | 0人学习

C# 教程
C# 教程

共94课时 | 20.2万人学习