我运行了从P4下载的P4api.net示例C#代码,以遍历我拥有的本地P4 /depot
存储库。当示例代码尝试读取子目录和文件的//depot/subdirA
时,对API函数GetFileMetaData()
的调用会遇到空指针异常。当//depot/subdirA
只包含没有文件的子目录时会发生这种情况。如果//depot/subdirA
包含一个或多个文件,则GetFileMetaData()
可以正常运行。我必须遗漏一些东西,因为我认为GetFileMetaData()
应该适用于存在或不存在文件的目录。
以下是P4示例代码 - 请参阅异常位置的代码注释:
// if we have the depot path, get a list of the subdirectories from the depot
if (!String.IsNullOrEmpty(depotPath))
{
IList<string> subdirs = _repository.GetDepotDirs(null, String.Format("{0}/*", depotPath));
if ((subdirs != null) && (subdirs.Count >0))
{
subdirectories = P4DirectoryMap.FromDirsOutput(_repository, Workspace, this, subdirs);
foreach (P4Directory dir in subdirectories.Values)
{
dir.InDepot = true;
}
}
IList<FileMetaData> fileList = _repository.GetFileMetaData(null, FileSpec.DepotSpec(String.Format("{0}/*", depotPath)));
// get a list of the files in the directory - debugger hit Null Exception within this call.
if (fileList != null)
{
files = P4FileMap.FromFstatOutput(fileList);
// if the directory contains files from the depot, we can use
// the local path of one of those files to determine the local
// path for this directory
if ((String.IsNullOrEmpty(localPath)) && (files != null) && (files.Count > 0))
{
我下载了P4api.net API源代码,并在GetFileMetaData()
内观察到r.TaggedOutput == null
主题目录中没有文件,只有更多子目录。这可能是我对源代码的误解,但我认为代码应该在运行FOR循环之前检查r.TaggedOutput == null
,请查看异常位置的代码注释:
public IList<FileMetaData> GetFileMetaData(Options options, params FileSpec[] filespecs )
{
P4.P4Command fstatCmd = new P4.P4Command(_connection._p4server, "fstat", true, FileSpec.ToStrings(filespecs));
P4.P4CommandResult r = fstatCmd.Run(options);
if (r.Success != true)
{
P4Exception.Throw(r.ErrorList);
return null;
}
List<FileMetaData> value = new List<FileMetaData>();
foreach (P4.TaggedObject obj in r.TaggedOutput)
// Null Exception was caused by r.TaggedOutput=null when the sub dir has no file.
{
FileMetaData fmd = new FileMetaData();
fmd.FromFstatCmdTaggedData(obj);
value.Add(fmd);
}
return value;
}
我如何解决这个问题,因为可以预期一个软件仓库目录有两个目录或文件,但是GetFileMetaData()
似乎期望dir总是有文件?我是否必须为传入的“选项”参数指定一个可以防止此异常的选项?或者是否有另一个API调用来检查代码在调用GetFileMetaData()之前可以调用的目录中是否存在文件?提前感谢您的帮助。
答案 0 :(得分:1)
此错误已报告并已针对P4API.NET的GA版本进行了修复。我不确定该什么时候发布,但您可以致电Perforce Support并询问相关信息。
与此同时,这是一个可能的解决办法,看看目录是否为空。
String[] cmdargs = new String[1];
cmdargs[0] = depotPath + "/*";
P4Command cmd = new P4Command(rep, "files", true, cmdargs);
P4CommandResult results = cmd.Run(null);
if (results != null && results.TaggedOutput != null)
{
foreach (TaggedObject obj in results.TaggedOutput)
{
// do something with file list if you want
}
}
else
{
Console.WriteLine("No files in this directory!");
}
基本上它使用与GetFileMetaData
类似的逻辑,但使用较低级别的命令直接从服务器获取标记输出。然后,在调用其他方法之前,可以检查结果集中是否存在任何文件。