Click or drag to resize

IHierarchyItemAsyncCopyToAsync Method

IT Hit WebDAV Classes Reference
Creates a copy of this item with a new name in the destination folder.

Namespace:  ITHit.WebDAV.Server
Assembly:  ITHit.WebDAV.Server (in ITHit.WebDAV.Server.dll) Version: 11.3.10719
Syntax
Task CopyToAsync(
	IItemCollectionAsync destFolder,
	string destName,
	bool deep,
	MultistatusException multistatus
)

Task CopyToAsync(
	IItemCollectionAsync destFolder,
	string destName,
	bool deep,
	MultistatusException multistatus
)

Parameters

destFolder
Type: ITHit.WebDAV.ServerIItemCollectionAsync
Destination folder.
destName
Type: SystemString
Name of the destination item.
deep
Type: SystemBoolean
Indicates whether to copy entire subtree.
multistatus
Type: ITHit.WebDAV.ServerMultistatusException
If some items fail to copy but operation in whole shall be continued, add information about the error into multistatus using AddInnerException(String, DavException).

Return Value

Type: Task
.
Exceptions
ExceptionCondition
LockedExceptionDestination item was locked and client did not provide lock token.
NeedPrivilegesExceptionThe user doesn't have enough privileges.
InsufficientStorageExceptionQuota limit is reached.
MultistatusExceptionErrors has occured during processing of item in the subtree and whole operation shall be aborted.
DavExceptionIn other cases. Possible status value is CONFLICT if destination folder doesn't exist.
Remarks

If error occurred while copying file located in a subtree, the server should try to continue copy operation and copy all other items. In this case you must add that error multistatus container.

A CopyToAsync method invocation must not copy any locks active on the source item. However, if this method copies the item into a folder that has a deep lock, then the destination item must be added to the lock.

Examples

The code below is part of 'WebDAVServer.FileSystemStorage.AspNet' C# & VB samples provided with the SDK.

public override async Task CopyToAsync(IItemCollectionAsync destFolder, string destName, bool deep, MultistatusException multistatus)
{
    DavFolder targetFolder = (DavFolder)destFolder;

    if (targetFolder == null || !Directory.Exists(targetFolder.FullPath))
    {
        throw new DavException("Target directory doesn't exist", DavStatus.CONFLICT);
    }

    string newFilePath = System.IO.Path.Combine(targetFolder.FullPath, destName);
    string targetPath = targetFolder.Path + EncodeUtil.EncodeUrlPart(destName);

    // If an item with the same name exists - remove it.
    try
    {
        IHierarchyItemAsync item = await context.GetHierarchyItemAsync(targetPath);
        if (item != null)
            await item.DeleteAsync(multistatus);
    }
    catch (DavException ex)
    {
        // Report error with other item to client.
        multistatus.AddInnerException(targetPath, ex);
        return;
    }

    // Copy the file togather with all extended attributes (custom props and locks).
    try
    {
        File.Copy(fileSystemInfo.FullName, newFilePath);

        var newFileSystemInfo = new FileInfo(newFilePath);
        if (FileSystemInfoExtension.IsUsingFileSystemAttribute)
        {
            await fileSystemInfo.CopyExtendedAttributes(newFileSystemInfo);
        }

        // Locks should not be copied, delete them.
        if (await fileSystemInfo.HasExtendedAttributeAsync("Locks"))
        {
            await newFileSystemInfo.DeleteExtendedAttributeAsync("Locks");
        }
    }
    catch (UnauthorizedAccessException)
    {
        // Fail
        NeedPrivilegesException ex = new NeedPrivilegesException("Not enough privileges");
        string parentPath = System.IO.Path.GetDirectoryName(Path);
        ex.AddRequiredPrivilege(parentPath, Privilege.Bind);
        throw ex;
    }
    await context.socketService.NotifyCreatedAsync(targetPath);
}
See Also