public async Task CloudFileDirectoryCloseHandleTask() { // TODO add non-zero test cases if OpenHandle is ever available over REST CloudFileShare share = GetRandomShareReference(); try { await share.CreateAsync(); CloudFileDirectory dir = share.GetRootDirectoryReference().GetDirectoryReference("mydir"); await dir.CreateAsync(); FileContinuationToken token = null; int handlesClosed = 0; const string nonexistentHandle = "12345"; do { CloseFileHandleResultSegment response = await dir.CloseHandleSegmentedAsync(nonexistentHandle, token); handlesClosed += response.NumHandlesClosed; token = response.ContinuationToken; } while (token != null && token.NextMarker != null); Assert.AreEqual(handlesClosed, 0); } finally { await share.DeleteIfExistsAsync(); } }
/// <summary> /// Gets the close handles implementation. /// </summary> /// <param name="token">Continuation token for closing many files.</param> /// <param name="handleId">Id of the handle, "*" if all handles on the file.</param> /// <param name="recursive">Whether to recurse through this directory's files and subfolders.</param> /// <param name="accessCondition">An <see cref="AccessCondition"/> object that represents the access conditions for the file. If <c>null</c>, no condition is used.</param> /// <param name="options">An <see cref="FileRequestOptions"/> object that specifies additional options for the request.</param> /// <returns>A <see cref="RESTCommand{T}"/> for closing the handles.</returns> private RESTCommand <CloseFileHandleResultSegment> CloseHandleImpl(FileContinuationToken token, string handleId, bool?recursive, AccessCondition accessCondition, FileRequestOptions options) { RESTCommand <CloseFileHandleResultSegment> putCmd = new RESTCommand <CloseFileHandleResultSegment>(this.ServiceClient.Credentials, this.StorageUri, this.ServiceClient.HttpClient); options.ApplyToStorageCommand(putCmd); putCmd.CommandLocationMode = CommandLocationMode.PrimaryOrSecondary; putCmd.RetrieveResponseStream = true; putCmd.BuildRequest = (cmd, uri, builder, cnt, serverTimeout, ctx) => { StorageRequestMessage msg = FileHttpRequestMessageFactory.CloseHandle(uri, serverTimeout, handleId, recursive, token, accessCondition, cnt, ctx, this.ServiceClient.GetCanonicalizer(), this.ServiceClient.Credentials); FileHttpRequestMessageFactory.AddMetadata(msg, this.Metadata); return(msg); }; putCmd.PreProcessResponse = (cmd, resp, ex, ctx) => { CloseFileHandleResultSegment res = HttpResponseParsers.ProcessExpectedStatusCodeNoException(HttpStatusCode.OK, resp, null /* retVal */, cmd, ex); int handlesClosed; if (!int.TryParse(resp.Headers.GetHeaderSingleValueOrDefault(Constants.HeaderConstants.NumHandlesClosed), out handlesClosed)) { handlesClosed = -1; } FileContinuationToken continuation = null; string marker; if ((marker = resp.Headers.GetHeaderSingleValueOrDefault(Constants.HeaderConstants.Marker)) != "") { continuation = new FileContinuationToken() { NextMarker = marker }; } return(new CloseFileHandleResultSegment() { NumHandlesClosed = handlesClosed, ContinuationToken = continuation }); }; return(putCmd); }