Tengo un requisito en el que tengo que descargar de forma recursiva todos los archivos de la carpeta raíz, subcarpeta y subcarpeta de la subcarpeta Nth.
¿Cómo puedo hacerlo? ¿Existe algún método para enumerar carpetas en una carpeta en particular? Además, ¿cómo puedo enumerar carpetas en la biblioteca de documentos raíz? @vgrem @Bachatero
Obtuve un enlace, que dice que recuperamos la carpeta completa y el árbol de estructura de archivos mediante una consulta.
Primera respuesta de este enlace: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure
Estoy tratando de replicar esto desde el enlace anterior usando su api: / _api / web / Lists / GetByTitle ('Documentos') / Items? $ Select = FileLeafRef, FileRef
Pero cuando intento esto usando el siguiente código:
folder = ctx.web.lists.get_by_title('Documents')
folder = folder.get_items('$select=FileLeafRef,FileRef')
Falla con un error: "el objeto 'str' no tiene el atributo 'payload'"
¿Qué hacer?
Hola,
puede usar el enfoque de llamar a proc, que se llama a sí mismo de forma recursiva, por ejemplo:
def printAllContents (ctx, relativaUrl):
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)
metro.
... entonces puede, por ejemplo, descargar cada archivo usando ServerRelativeUrl que se imprime ...
Publiqué mi consulta aquí : de una manera más estructurada.
FYI: El JSON es solo para fines de representación / comprensión.
No estoy seguro de a qué te refieres. Creo que el proceso del que he enumerado un ejemplo simplemente hace eso ... enumera de forma recursiva todas las carpetas / subcarpetas y archivos dentro de estas carpetas y subcarpetas ...
Ejemplo de descarga de archivos a medida que baja por el árbol de forma recursiva ...
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
de esta manera, obtendrá la lista plana que contiene la carpeta principal y las subcarpetas Nth.
sin embargo, esto es más lento en términos de rendimiento.
Saludos,
ya que esta pregunta ha sido respondida propongo cerrarla
Comentario más útil
de esta manera, obtendrá la lista plana que contiene la carpeta principal y las subcarpetas Nth.
sin embargo, esto es más lento en términos de rendimiento.