You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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是完整的文件路径(包含文件名),这是两者的核心差异。

修正步骤

  1. 修正复制路径:拼接出完整的目标文件路径,替换原复制代码:
string targetFilePath = Path.Combine(appPath, "DB.accdb");
File.Copy(@"\\app18\Database\DB.accdb", targetFilePath);
  1. 修复异常信息显示:删除文件的catch块中,字符串插值语法错误,改为:
Console.WriteLine($"Error deleting file: {ex.Message}");
  1. 优化启动路径:启动进程时直接使用已定义的targetFilePath,避免手动拼接错误:
Process.Start(targetFilePath);

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:42:11