This topic has been asked recently on StackOverflow. The question was how to create a Folder (or actually a series of nested Folders) like /aaa/bbb/ccc/ddd using the Core Service in Tridion 2011SP1?
The answer is you have to create each individual Folder as a sub-folder of an existing parent. This means the approach is very well suited to be handled with a recursive call.
I created a method called GetOrCreate(path) that checks if the path exists. If it does, it returns the FolderData object. Otherwise, it splits the path into a parent path and a new folder name and applies recursion on the parent path. On the way out of the recursion, the new folders are created as children of the (by now) existing parents.
Note: the method does not validate the folderPath. Rather, it expects it to be syntactically correct and its stem to represent a valid and existing Publication WebDAV URL.
Call this method using a construct like this:
You cal also use a CoreServiceSession, as described in my earlier post.
The answer is you have to create each individual Folder as a sub-folder of an existing parent. This means the approach is very well suited to be handled with a recursive call.
I created a method called GetOrCreate(path) that checks if the path exists. If it does, it returns the FolderData object. Otherwise, it splits the path into a parent path and a new folder name and applies recursion on the parent path. On the way out of the recursion, the new folders are created as children of the (by now) existing parents.
private FolderData
GetOrCreateFolder(string folderPath, SessionAwareCoreServiceClient client)
{
ReadOptions readOptions = new
ReadOptions();
if (client.IsExistingObject(folderPath))
{
return client.Read(folderPath, readOptions) as FolderData;
}
else
{
int lastSlashIdx = folderPath.LastIndexOf("/");
string newFolder = folderPath.Substring(lastSlashIdx
+ 1);
string parentFolder = folderPath.Substring(0,
lastSlashIdx);
FolderData parentFolderData =
GetOrCreateFolder(parentFolder, client);
FolderData newFolderData = client.GetDefaultData(ItemType.Folder, parentFolderData.Id) as FolderData;
newFolderData.Title = newFolder;
return client.Save(newFolderData, readOptions) as FolderData;
}
}
Note: the method does not validate the folderPath. Rather, it expects it to be syntactically correct and its stem to represent a valid and existing Publication WebDAV URL.
Call this method using a construct like this:
FolderData folderData = GetOrCreateFolder(
"/webdav/020 Content/Building
Blocks/aaa/bbb/ccc",
new SessionAwareCoreServiceClient());
You cal also use a CoreServiceSession, as described in my earlier post.
Comments
"Just say no" to manual folder creation!