使用Google Drive API启动程序报错:client_id.json路径异常
解决Google Drive登录时
client_id.json路径错误问题 看起来你的程序在读取client_id.json时,默认用了相对路径,但程序启动时的当前工作目录被自动设置成了C:\Windows\system32(这种情况常发生在以管理员身份启动程序、或通过Windows服务运行程序时),所以才会跑去system32目录找文件,而非你存放文件的程序文件夹。
从你给出的代码片段来看,你已经定义了固定路径c:\ProComercio\,但没看到你用这个路径来拼接client_id.json的完整路径——我猜你加载文件的代码大概率是类似下面的错误写法:
// 错误示例:用相对路径会基于当前工作目录查找 var credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.LoadFromFile("client_id.json").Secrets, Scopes, "user", CancellationToken.None ).Result;
正确的解决思路
核心是使用绝对路径加载client_id.json,你有两种可靠的方案可选:
方案1:基于程序执行目录加载文件
如果你把client_id.json和程序放在同一个文件夹里,直接获取程序的执行目录来拼接路径:
public Google.Apis.Auth.OAuth2.UserCredential Autenticar() { // 获取当前程序的实际执行目录 string appRootDir = AppDomain.CurrentDomain.BaseDirectory; // 拼接client_id.json的完整绝对路径 string clientIdFilePath = Path.Combine(appRootDir, "client_id.json"); // 用绝对路径加载密钥文件 var secrets = GoogleClientSecrets.LoadFromFile(clientIdFilePath).Secrets; // 执行授权逻辑(替换成你的实际权限范围) var credential = GoogleWebAuthorizationBroker.AuthorizeAsync( secrets, new[] { DriveService.Scope.Drive }, "user", CancellationToken.None ).Result; return credential; }
方案2:用你预定义的caminhoarquivo路径
如果你打算把client_id.json放在c:\ProComercio\目录下,先确保文件已经移到这个目录,再拼接完整路径:
public Google.Apis.Auth.OAuth2.UserCredential Autenticar() { string caminhoarquivo = @"c:\ProComercio\"; // 确保目录存在 if (!Directory.Exists(caminhoarquivo)) { Directory.CreateDirectory(caminhoarquivo); } // 拼接client_id.json的绝对路径 string clientIdFilePath = Path.Combine(caminhoarquivo, "client_id.json"); // 加载密钥文件并执行授权 var secrets = GoogleClientSecrets.LoadFromFile(clientIdFilePath).Secrets; // 后续授权逻辑... }
补充说明:为什么会跳到system32?
当你双击运行程序时,当前工作目录默认是程序的执行目录,但如果通过以下方式启动,系统会自动把工作目录切换到system32:
- 右键程序选择「以管理员身份运行」
- 程序作为Windows服务运行
- 从命令提示符的system32目录下启动程序
用绝对路径加载配置文件,就能彻底避开当前工作目录带来的路径混乱问题。
内容的提问来源于stack exchange,提问作者Osvaldo Junior
相关产品推荐
相关产品推荐

