Eu tenho um requisito onde devo baixar recursivamente todos os arquivos da pasta raiz, subpasta e subpasta de subpasta para enésimo.
Como posso fazer isso? Existe um método para listar pastas em uma pasta específica? Além disso, como posso listar pastas na Biblioteca de documentos raiz? @vgrem @Bachatero
Recebi um link que diz que recuperamos toda a pasta e a árvore de estrutura de arquivos usando uma consulta.
Primeira resposta deste link: https://sharepoint.stackexchange.com/questions/159105/with-rest-recursively-retrieve-file-and-folder-directory-structure
Estou tentando replicar isso do link acima usando sua api: / _api / web / Lists / GetByTitle ('Documents') / Items? $ Select = FileLeafRef, FileRef
Mas quando tento fazer isso usando o código abaixo:
folder = ctx.web.lists.get_by_title('Documents')
folder = folder.get_items('$select=FileLeafRef,FileRef')
Ele falha com um erro: "objeto 'str' não tem atributo 'carga útil'"
O que fazer?
Oi,
você pode usar a abordagem de chamar proc, que se chama recursivamente, por exemplo:
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["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)
m.
... você pode então, por exemplo, baixar cada arquivo usando ServerRelativeUrl que é impresso ...
Postei minha consulta aqui : de uma forma mais estruturada.
FYI: O JSON existe apenas para fins de representação / compreensão.
Não tenho certeza do que você está querendo dizer. Acho que a proc que listei como exemplo faz isso ... lista recursivamente todas as pastas / subpastas e arquivos dentro dessas pastas e subpastas ...
Exemplo de download de arquivos conforme você desce na árvore recursivamente ...
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
dessa forma, você terá uma lista simples que contém a pasta pai e as enésimas subpastas.
no entanto, isso é mais lento em termos de desempenho.
Saudações,
uma vez que esta questão foi respondida, proponho fechá-la
Comentários muito úteis
dessa forma, você terá uma lista simples que contém a pasta pai e as enésimas subpastas.
no entanto, isso é mais lento em termos de desempenho.