ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

P4 .NET API でワークスペース名を取得する

P4 .NET API を使用して指定ユーザーが作成したワークスペースを取得する方法です。

こちらのメソッドを使用します。


結果から言えばこちらのような内容でうまくいきました。 

public void ConnectWS()
{
    Server srv = new Server(new ServerAddress(P4PORT));
    p4 = new Repository(srv);

    con = p4.Connection;
    con.UserName = P4USER;
    con.Client = new Client();
    con.Client.Name = P4CLIENT;

    connected = con.Connect(null);
    if (connected)
    {
        try
        {
            // Attempt a Login
            Credential cred = con.Login(P4PASSWD);
            
            // Get workspace name
            ClientsCmdOptions opts = new ClientsCmdOptions(ClientsCmdFlags.None, P4USER, null, 10, null);
            IList<Client> clients = p4.GetClients(opts);

            var wsList = new List<string>();

            foreach (var client in clients)
            {
                wsList.Add(client.Name.ToString());
            }

            // Check to exist the workspace
            if (wsList.Contains(P4CLIENT))
            {
                MessageBox.Show(P4CLIENT + " は存在します");
            }
            else
            {
                MessageBox.Show(P4CLIENT + " は存在しません");
            }
        }
        catch (P4Exception e)
        {
            connected = false;
            MessageBox.Show("接続に失敗しました。設定を確認してください");
            Console.WriteLine("Couldn't connect P4-Server!\n {0} : {1}", e.ErrorCode, e.Message);
        }
    }
}


接続先のディポの情報の取得がこちらで、公式ドキュメントのサンプル通りになります。

// Get workspace name
ClientsCmdOptions opts =
        new ClientsCmdOptions(ClientsCmdFlags.None, P4USER, null, 10, null);
IList<Client> clients = p4.GetClients(opts);


第二引数でユーザー名を指定しています。
複数存在する可能性があるのでリストに格納しています。

試しにメッセージボックスで表示してみると下図のような感じで、ディポの様々な情報が取得できますが、欲しいのは「Client」の値です(プロパティ一覧)。

f:id:moko_03_25:20200908025957p:plain

この Client の項目は Name プロパティで取得できるようです。
そこで別途リストを作成して Foreach でワークスペース名だけ抽出しています。

var wsList = new List<string>();
foreach (var client in clients)
{
        wsList.Add(client.Name.ToString());
}


そしてリストに対して Contains メソッドで一致するものが含まれるか調べています。

// Check to exist the workspace
if (wsList.Contains(P4CLIENT))
{
        MessageBox.Show(P4CLIENT + " は存在します");
}
else
{
        MessageBox.Show(P4CLIENT + " は存在しません");
}

 

以上、メモでした!