You might see that the Dropbox Community team have been busy working on some major updates to the Community itself! So, here is some info on what’s changed, what’s staying the same and what you can expect from the Dropbox Community overall.

Forum Discussion

Nickk888's avatar
Nickk888
Explorer | Level 3
7 years ago

.NET C# - Check and download/Sync missing files with local files

Hello everyone!

I'm stuck for 2 days now with the API... I'm creating a game launcher where i need to download(sync), all the files for the game Client from Dropbox to the User.

My goal is to check within the local files if the file from my dropbox account exists, if not, download to the specific folder.

It's kinda frustrating using async tasks... But i need my application to be responsive while checking and downloading files, also using a progressbar showing the specific file that is been downloaded. I don't want to download a Zip file because if i made a small change within the client, i don't want the user to download the whole client again and again...

To check if a file has been modified, i wanted to use the Hashing method, but i have no idea how to use it... So i think it is easier to use the file size as a reference?

After one day i finally did a simple Dropbox files and directory list... It was a pain in the A...

But i noticed it is not possible to async download a file inside the async check? Or am i doing something wrong? I know something about C#, but i had always problems understanding the async function...

So my questions are:
- How can i check if a specific file has been modified in the dropbox directory comparing it with the local files(If it hjas been downloaded before)?
- How can i download the file asynchronously to the same local folder?
- How can i implement a progress bar showing the file name AND the progress in percent(0-100)?

i hope you can help me somehow, i searched for a solution on google before, but i had no luck or i didn't understand the specific solution.
Google Drive is too complicated for me, so i hope i have some luck using Dropbox...

And sorry for my english, i'm no native english speaker!

Oh, yeah, here's my code:

static async Task CheckFiles()
        {
            using (var dbx = new DropboxClient(token))
            {
                var amount = 0;
                var list = await dbx.Files.ListFolderAsync(string.Empty, true, false, false, false, true);
                string directoryPath;

                Debug.WriteLine("Dropbox File lister BEGIN");

                foreach (var item in list.Entries.Where(i => i.IsFolder))
                {
                    Debug.WriteLine("Directory: " + item.AsFolder.PathDisplay);
                    directoryPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + ClientDirectory + item.PathDisplay;
                    Directory.CreateDirectory(directoryPath);
                    amount++;
                }

                foreach (var item in list.Entries.Where(i => i.IsFile))
                {
                    Debug.WriteLine("File: {0} | Directory: {1} | Size: {2} | Hash: {3}", item.Name, Path.GetDirectoryName(item.PathDisplay), item.AsFile.Size, item.AsFile.ContentHash);
                    //That's not working!
                    using (var response = dbx.Files.DownloadAsync(Path.GetDirectoryName(item.PathDisplay) + "/" + item.Name))
                    {
                        Debug.WriteLine(response.GetContentAsStringAsync());
                    }
                    //
                    amount++;
                }

                Debug.WriteLine("Dropbox File lister END - Found: {0} entries", amount);
            }
        }


Best regards!

  • [Cross-linking for reference: https://stackoverflow.com/questions/52625933/net-c-sharp-check-and-download-sync-missing-files-with-local-files-using-drop ]

    "use the file size as a reference?"

    I do not recommend using size, as that can result in false positives. That is, two files can have the same size but different contents.

    "How can i check if a specific file has been modified in the dropbox directory comparing it with the local files(If it hjas been downloaded before)?"

    One way to do this would be to record which "rev" you downloaded, that is, the FileMetadata.Rev, included with the file download. When you check again later (e.g., from GetMetadata or ListFolder[Continue]), if the rev hasn't changed, you know you still have the latest copy. If the rev has changed, the file data may have changed.

    Alternatively, you can check the FileMetadata.ContentHash. That can directly indicate if you have the same file data. You can find information on how that works here.


    "How can i download the file asynchronously to the same local folder?"

    You can use the DownloadAsync method to download files, as seen in the examples here and here. What you do with the file data is up to you. For instance, unlike those examples, it sounds like you want to save the data to the local filesystem.


    "How can i implement a progress bar showing the file name AND the progress in percent(0-100)?"

    The Dropbox API v2 .NET SDK does not offer progress listeners, but I'll be sure to pass this along as feedback. You can track progress from the download stream itself though as shown in this thread.

     


  • Greg-DB's avatar
    Greg-DB
    Icon for Dropbox Staff rankDropbox Staff

    [Cross-linking for reference: https://stackoverflow.com/questions/52625933/net-c-sharp-check-and-download-sync-missing-files-with-local-files-using-drop ]

    "use the file size as a reference?"

    I do not recommend using size, as that can result in false positives. That is, two files can have the same size but different contents.

    "How can i check if a specific file has been modified in the dropbox directory comparing it with the local files(If it hjas been downloaded before)?"

    One way to do this would be to record which "rev" you downloaded, that is, the FileMetadata.Rev, included with the file download. When you check again later (e.g., from GetMetadata or ListFolder[Continue]), if the rev hasn't changed, you know you still have the latest copy. If the rev has changed, the file data may have changed.

    Alternatively, you can check the FileMetadata.ContentHash. That can directly indicate if you have the same file data. You can find information on how that works here.


    "How can i download the file asynchronously to the same local folder?"

    You can use the DownloadAsync method to download files, as seen in the examples here and here. What you do with the file data is up to you. For instance, unlike those examples, it sounds like you want to save the data to the local filesystem.


    "How can i implement a progress bar showing the file name AND the progress in percent(0-100)?"

    The Dropbox API v2 .NET SDK does not offer progress listeners, but I'll be sure to pass this along as feedback. You can track progress from the download stream itself though as shown in this thread.

     


  • mikesam's avatar
    mikesam
    Explorer | Level 4

    Hi Nickk,

     

    Do the game launcher work for you?

    If yes, do we need to hardcode the token and make it available to all client user?

    Thanks and hope to hear from you soon.

     

    Best Regards,

    Mike

    • Здравко's avatar
      Здравко
      Legendary | Level 20

      mikesam wrote:

      ...

      If yes, do we need to hardcode the token and make it available to all client user?

      ...


      Hi mikesam,

      Any kind of authentication info (including token) should be handled with care. Such information should be embedded only when application gonna be used on server side or by responsible person (or limited set of persons). In any other case embedding such information can be considered as a security hole. It can be dangerous for both the authenticated account as well as application users. So, such thing should be performed with extreme care and it's generally discouraged!

      • mikesam's avatar
        mikesam
        Explorer | Level 4

        Hi Здравко,

         

        Thanks for you reply.

        Do you have any better suggestions if I had the same use case as Nickk?

         

        The idea was have a game launcher can get up-to-date files from dropbox (specified folder)

        Without write access to that token would be fine I guess.

         

        Best Regards,

        Mike

About Dropbox API Support & Feedback

Node avatar for Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

5,910 PostsLatest Activity: 3 days ago
333 Following

If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.

For more info on available support options for your Dropbox plan, see this article.

If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!