Office365-rest-python-client: كيف يتم تنزيل جميع ملفات مستندات Sharepoint بشكل متكرر من المجلدات والمجلدات الفرعية؟

تم إنشاؤها على ٢ أبريل ٢٠١٩  ·  9تعليقات  ·  مصدر: vgrem/Office365-REST-Python-Client

لدي مطلب حيث يتعين علي تنزيل جميع الملفات بشكل متكرر من المجلد الجذر والمجلد الفرعي والمجلد الفرعي إلى Nth.

كيف يمكنني القيام بذلك؟ هل هناك طريقة لسرد المجلدات في مجلد معين؟ أيضًا ، كيف يمكنني سرد ​​المجلدات في مكتبة المستندات الجذر؟ تضمين التغريدة

question

التعليق الأكثر فائدة

folder_list = []

def get_folder_relativeUrl(context, folder_relativeUrl):

    libraryRoot = context.web.get_folder_by_server_relative_url(folder_relativeUrl)
    folders = libraryRoot.folders
    context.load(folders)
    context.execute_query()

    for cur_folder in folders:
        folder_list.append(cur_folder.properties["ServerRelativeUrl"])
        get_folder_relativeUrl(context, cur_folder.properties["ServerRelativeUrl"])

    return folder_list

بهذه الطريقة ستمنحك القائمة الكاملة التي تحتوي على المجلد الأصل والمجلدات الفرعية N ..

ومع ذلك ، هذا أبطأ من حيث الأداء.

ال 9 كومينتر

حصلت على رابط يقول إننا نسترجع المجلد بالكامل وشجرة بنية الملف باستخدام استعلام.

الإجابة الأولى لهذا الرابط: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure

أحاول نسخ هذا من الرابط أعلاه باستخدام واجهة برمجة التطبيقات الخاصة بك: / _api / web / Lists / GetByTitle ('Documents') / Items؟ $ select = FileLeafRef، FileRef

ولكن عندما أحاول ذلك باستخدام الكود أدناه:

folder = ctx.web.lists.get_by_title('Documents')
folder = folder.get_items('$select=FileLeafRef,FileRef')

فشل مع وجود خطأ: "كائن 'str' ليس له سمة 'حمولة'"

ما يجب القيام به؟

أهلا،

يمكنك استخدام طريقة استدعاء proc ، والتي تستدعي نفسها بشكل متكرر ، على سبيل المثال:

def printAllContents (ctx ،uableUrl):

try:

    libraryRoot = ctx.web.get_folder_by_server_relative_url(relativeUrl)
    ctx.load(libraryRoot)
    ctx.execute_query()

    folders = libraryRoot.folders
    ctx.load(folders)
    ctx.execute_query()

    for myfolder in folders:
        print("Folder name: {0}".format(myfolder.properties["ServerRelativeUrl"]))
        printAllContents(ctx, relativeUrl + '/' + myfolder.properties["Name"])

    files = libraryRoot.files
    ctx.load(files)
    ctx.execute_query()

    for myfile in files:
        #print("File name: {0}".format(myfile.properties["Name"]))
        print("File name: {0}".format(myfile.properties["ServerRelativeUrl"]))
except:

    print('Problem printing out list of folders')   
    sys.exit(1)

م.

... يمكنك بعد ذلك ، على سبيل المثال ، تنزيل كل ملف باستخدام ServerRelativeUrl الذي يتم طباعته ...

لقد قمت بنشر استفساري هنا : بطريقة أكثر تنظيماً.

لمعلوماتك: JSON هناك فقط لغرض التمثيل / الفهم.

لست متأكدًا مما ستحصل عليه. أعتقد أن proc التي أدرجتها مثالاً على ذلك ... يسرد بشكل متكرر جميع المجلدات / المجلدات الفرعية والملفات داخل هذه المجلدات والمجلدات الفرعية ...

مثال على تنزيل الملفات وأنت تنزل على الشجرة بشكل متكرر ...

outputDir = "d:\output"

def printAllContents(ctx, relativeUrl):

    try:

        libraryRoot = ctx.web.get_folder_by_server_relative_url(relativeUrl)
        ctx.load(libraryRoot)
        ctx.execute_query()

        folders = libraryRoot.folders
        ctx.load(folders)
        ctx.execute_query()

        for myfolder in folders:
            #print("Folder name: {0}".format(myfolder.properties["Name"]))
            print("Folder name: {0}".format(myfolder.properties["ServerRelativeUrl"]))
            printAllContents(ctx, relativeUrl + '/' + myfolder.properties["Name"])

        files = libraryRoot.files
        ctx.load(files)
        ctx.execute_query()

        for myfile in files:
            print("File name: {0}".format(myfile.properties["ServerRelativeUrl"]))
            pathList = myfile.properties["ServerRelativeUrl"].split('/')
            fileDest = outputDir + "/"+ pathList[-1]
            downloadFile(ctx, fileDest, myfile.properties["ServerRelativeUrl"])

    except:

        print('Problem printing out list of folders')   
        sys.exit(1)
folder_list = []

def get_folder_relativeUrl(context, folder_relativeUrl):

    libraryRoot = context.web.get_folder_by_server_relative_url(folder_relativeUrl)
    folders = libraryRoot.folders
    context.load(folders)
    context.execute_query()

    for cur_folder in folders:
        folder_list.append(cur_folder.properties["ServerRelativeUrl"])
        get_folder_relativeUrl(context, cur_folder.properties["ServerRelativeUrl"])

    return folder_list

بهذه الطريقة ستمنحك القائمة الكاملة التي تحتوي على المجلد الأصل والمجلدات الفرعية N ..

ومع ذلك ، هذا أبطأ من حيث الأداء.

تحيات،

منذ أن تمت الإجابة على هذا السؤال أقترح إغلاقه

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات