如何从给定 C# 链接的特定 GitHub 存储库中获取文件列表?

Sha*_*mer 4 .net c# git github

如何从 GitHub 链接获取文件列表?

例如,来自此 GitHub 存储库链接:https://github.com/crs2007/ActiveReport/tree/master/ActiveReport/SQLFiles

我们可以看到有SQL文本文件:

包含相关文件的 GitHub 页面(图)

我想获取这些文件的列表:

  • 腐败问题.sql
  • DBAlert.sql
  • 数据库信息.sql
  • 数据库默认登录.sql
  • 数据库文件.sql
  • 死锁.sql
  • 默认跟踪.sql
  • 磁盘信息.sql
  • 已安装程序.sql
  • .等等...sql

我怎样才能做到这一点?

Ale*_*lex 5

您应该能够使用GitHub Contents API

通过提出如下请求:

curl https://api.github.com/repos/crs2007/ActiveReport/contents/ActiveReport
Run Code Online (Sandbox Code Playgroud)

Github 将返回包含目录内容的 JSON。

您可以通过多种方式在 C# 中执行此操作,可能建议使用Octokit之类的工具,因为它们可以解决您可能遇到的大多数问题。如果您无法使用外部库,下面的示例展示了如何使用普通的 HttpClient 来实现相同的目的,尽管涉及更多的管道:

class Program
{
    static void Main()
    {
        Task.Factory.StartNew(async () =>
        {
            var repoOwner = "crs2007";
            var repoName = "ActiveReport";
            var path = "ActiveReport";

            var httpClientResults = await ListContents(repoOwner, repoName, path);
            PrintResults("From HttpClient", httpClientResults);

            var octokitResults = await ListContentsOctokit(repoOwner, repoName, path);
            PrintResults("From Octokit", octokitResults);

        }).Wait();
        Console.ReadKey();
    }

    static async Task<IEnumerable<string>> ListContents(string repoOwner, string repoName, string path)
    {
        using (var client = GetGithubHttpClient())
        {
            var resp = await client.GetAsync($"repos/{repoOwner}/{repoName}/contents/{path}");
            var bodyString = await resp.Content.ReadAsStringAsync();
            var bodyJson = JToken.Parse(bodyString);
            return bodyJson.SelectTokens("$.[*].name").Select(token => token.Value<string>());
        }
    }

    static async Task<IEnumerable<string>> ListContentsOctokit(string repoOwner, string repoName, string path)
    {
        var client = new GitHubClient(new ProductHeaderValue("Github-API-Test"));
        // client.Credentials = ... // Set credentials here, otherwise harsh rate limits apply.

        var contents = await client.Repository.Content.GetAllContents(repoOwner, repoName, path);
        return contents.Select(content => content.Name);
    }

    private static HttpClient GetGithubHttpClient()
    {
        return new HttpClient
        {
            BaseAddress = new Uri("https://api.github.com"),
            DefaultRequestHeaders =
            {
                // NOTE: You'll have to set up Authentication tokens in real use scenario
                // NOTE: as without it you're subject to harsh rate limits.
                {"User-Agent", "Github-API-Test"}
            }
        };
    }

    static void PrintResults(string source, IEnumerable<string> files)
    {
        Console.WriteLine(source);
        foreach (var file in files)
        {
            Console.WriteLine($" -{file}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)