C# Perforce P4 API: Client.GetSyncedFiles 导致异常

C# Perforce P4 API: Client.GetSyncedFiles causes an exception

我正在尝试查看工作区中的文件,最终我想使用 GetSyncedFiles() 来简单地查看文件的当前状态以及它的修订版本,以便我可以提醒用户。但是我不能在没有标志的情况下执行最简单的操作。

异常消息是"GetSyncedFiles has no valid options\r\nParameter name: options"

我试过省略文件列表并在选项中设置不同的标志,结果总是一样。

try
{
    Perforce.P4.Server srv = new Perforce.P4.Server(new ServerAddress(PerforceServer + ":" + PerforcePort));
    Repository epo = new Perforce.P4.Repository(srv);
    repo.Connection.UserName = PerforceUser;
    repo.Connection.SetClient(PerforceWorkspace);
    repo.Connection.Client.Name = PerforceWorkspace;
    repo.Connection.Connect(new Perforce.P4.Options());
    repo.Connection.Login(PerforcePassword);

    List<FileSpec> fileSpecs = new List<FileSpec>();
    foreach (var filename in Directory.GetFiles(DirectoryWithTargetFiles))
    {
        fileSpecs.Add(new FileSpec(new ClientPath(filename)));
    }

    SyncFilesCmdOptions cmdFlags = new SyncFilesCmdOptions(SyncFilesCmdFlags.None);
    FileSpec[] fsa = fileSpecs.ToArray();
    var someFiles = m_repo.Connection.Client.GetSyncedFiles(cmdFlags, fsa);//execution gets to here
}
catch (Perforce.P4.P4Exception e)
{
    Console.WriteLine(e.Message);
}
catch (Exception ee)
{
    //this exception will hit
    Console.WriteLine(ee.Message);
}

我的猜测是一个空的选项对象被标记为无效:

如果您查看文档,该选项有许多覆盖默认选项的子classes class https://www.perforce.com/manuals/p4api.net/p4api.net_reference/html/T_Perforce_P4_Options.htm

您是否尝试过 this one 等选项?或者你试过只传递 null 吗?或省略该行?

repo.Connection.Connect(new Perforce.P4.Options());

来自 source code of the Perforce .NET API in the GitHub repository

public IList<FileSpec> GetSyncedFiles(Options options, params FileSpec[] files)
    {
        if (options != null)
        {
            throw new ArgumentException("GetSynchedFiles has no valid options", "options");
        }
        return runFileListCmd("have", options, files);
    }

可以注意到,如果 options 不是 null,它会抛出一个 ArgumentException。 因此,为了使其工作,您必须通过 null 选项:

var someFiles = m_repo.Connection.Client.GetSyncedFiles(null, fsa);

此外,第二个重载将其重定向到相同的方法:

public IList<FileSpec> GetSyncedFiles(IList<FileSpec> toFiles, Options options)
    {
        return GetSyncedFiles(options, toFiles.ToArray<FileSpec>());
    }