为何VBA可复制.accdb文件而C#控制台程序遇权限错误?
问题
我们有一款旧版MS Access应用,可将新的MS Access .accdb文件复制到C:\Users{username}\AppData\Local\DB目录,对应的VBA代码运行正常:
Set fso = CreateObject("Scripting.FileSystemObject") fso.copyfile strRemoteFile, strLocalFile
改用C#控制台程序重写该功能时,复制.accdb文件始终出现权限错误,C#代码如下:
Console.WriteLine("Removing previous DB copy..."); //find the user local folder string appPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); appPath = $"{appPath}\\DB Application"; // create folder if does not exits if (!Directory.Exists(appPath)) { Directory.CreateDirectory(appPath); } // remove copy if exists if (File.Exists($"{appPath}\\DB.accdb")) { try { File.Delete($"{appPath}\\DB.accdb"); Console.WriteLine("File DB.accdb deleted successfully."); } catch (Exception ex) { Console.WriteLine("Error deleting file: {ex.Message}"); } } Console.WriteLine("Copying DB to working folder..."); File.Copy(@"\\app18\Database\DB.accdb", appPath); Console.WriteLine("Launching DB..."); Process.Start($"{appPath}\\DB.accdb"); Environment.Exit(0);
为何VBA能完成操作而C#却不行?
原因与解决方法
这不是权限问题,而是C#代码的参数错误:
File.Copy要求第二个参数是目标文件的完整路径,但你传入的appPath只是目录路径,系统会尝试将文件复制到目录对象上,从而抛出类似权限错误的异常。- VBA代码中的
strLocalFile是完整的文件路径(包含文件名),这是两者的核心差异。
修正步骤
- 修正复制路径:拼接出完整的目标文件路径,替换原复制代码:
string targetFilePath = Path.Combine(appPath, "DB.accdb"); File.Copy(@"\\app18\Database\DB.accdb", targetFilePath);
- 修复异常信息显示:删除文件的catch块中,字符串插值语法错误,改为:
Console.WriteLine($"Error deleting file: {ex.Message}");
- 优化启动路径:启动进程时直接使用已定义的
targetFilePath,避免手动拼接错误:
Process.Start(targetFilePath);
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

