Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Azure File Share JavaScript/TypeScript SDK (@azure/storage-file-share) for SMB file share operations. Use for creating shares, managing directories, uploading/downloading files, and handling file metadata. Supports Azure Files SMB protocol scenarios. Triggers: "file share", "@azure/storage-file-share", "ShareServiceClient", "ShareClient", "SMB", "Azure Files".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 194% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 176% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 114% | 0% |
SDK for Azure File Share operations — SMB file shares, directories, and file operations.
bashnpm install @azure/storage-file-share @azure/identity
Current Version: 12.x Node.js: >= 18.0.0
bashAZURE_STORAGE_ACCOUNT_NAME=<account-name> AZURE_STORAGE_ACCOUNT_KEY=<account-key> # OR connection string AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=... AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
typescriptimport { ShareServiceClient } from "@azure/storage-file-share"; const client = ShareServiceClient.fromConnectionString( process.env.AZURE_STORAGE_CONNECTION_STRING! );
typescriptimport { ShareServiceClient, StorageSharedKeyCredential } from "@azure/storage-file-share"; const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!; const accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!; const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey); const client = new ShareServiceClient( `https://${accountName}.file.core.windows.net`, sharedKeyCredential );
typescriptimport { ShareServiceClient } from "@azure/storage-file-share"; import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity"; // Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential> const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]}); // Or use a specific credential directly in production: // See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes // const credential = new ManagedIdentityCredential(); const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!; const client = new ShareServiceClient( `https://${accountName}.file.core.windows.net`, credential );
typescriptimport { ShareServiceClient } from "@azure/storage-file-share"; const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!; const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!; const client = new ShareServiceClient( `https://${accountName}.file.core.windows.net${sasToken}` );
ShareServiceClient (account level)
└── ShareClient (share level)
└── ShareDirectoryClient (directory level)
└── ShareFileClient (file level)typescriptconst shareClient = client.getShareClient("my-share"); await shareClient.create(); // Create with quota (in GB) await shareClient.create({ quota: 100 });
typescriptfor await (const share of client.listShares()) { console.log(share.name, share.properties.quota); } // With prefix filter for await (const share of client.listShares({ prefix: "logs-" })) { console.log(share.name); }
typescriptawait shareClient.delete(); // Delete if exists await shareClient.deleteIfExists();
typescriptconst properties = await shareClient.getProperties(); console.log("Quota:", properties.quota, "GB"); console.log("Last Modified:", properties.lastModified);
typescriptawait shareClient.setQuota(200); // 200 GB
typescriptconst directoryClient = shareClient.getDirectoryClient("my-directory"); await directoryClient.create(); // Create nested directory const nestedDir = shareClient.getDirectoryClient("parent/child/grandchild"); await nestedDir.create();
typescriptconst directoryClient = shareClient.getDirectoryClient("my-directory"); for await (const item of directoryClient.listFilesAndDirectories()) { if (item.kind === "directory") { console.log(`[DIR] ${item.name}`); } else { console.log(`[FILE] ${item.name} (${item.properties.contentLength} bytes)`); } }
typescriptawait directoryClient.delete(); // Delete if exists await directoryClient.deleteIfExists();
typescriptconst exists = await directoryClient.exists(); if (!exists) { await directoryClient.create(); }
typescriptconst fileClient = shareClient .getDirectoryClient("my-directory") .getFileClient("my-file.txt"); // Upload string const content = "Hello, World!"; await fileClient.create(content.length); await fileClient.uploadRange(content, 0, content.length);
typescriptimport * as fs from "fs"; import * as path from "path"; const fileClient = shareClient.rootDirectoryClient.getFileClient("uploaded.txt"); const localFilePath = "/path/to/local/file.txt"; const fileSize = fs.statSync(localFilePath).size; await fileClient.create(fileSize); await fileClient.uploadFile(localFilePath);
typescriptconst buffer = Buffer.from("Hello, Azure Files!"); const fileClient = shareClient.rootDirectoryClient.getFileClient("buffer-file.txt"); await fileClient.create(buffer.length); await fileClient.uploadRange(buffer, 0, buffer.length);
typescriptimport * as fs from "fs"; const fileClient = shareClient.rootDirectoryClient.getFileClient("streamed.txt"); const readStream = fs.createReadStream("/path/to/local/file.txt"); const fileSize = fs.statSync("/path/to/local/file.txt").size; await fileClient.create(fileSize); await fileClient.uploadStream(readStream, fileSize, 4 * 1024 * 1024, 4); // 4MB buffer, 4 concurrency
typescriptconst fileClient = shareClient .getDirectoryClient("my-directory") .getFileClient("my-file.txt"); const downloadResponse = await fileClient.download(); // Read as string const chunks: Buffer[] = []; for await (const chunk of downloadResponse.readableStreamBody!) { chunks.push(Buffer.from(chunk)); } const content = Buffer.concat(chunks).toString("utf-8");
typescriptconst fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt"); await fileClient.downloadToFile("/path/to/local/destination.txt");
typescriptconst fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt"); const buffer = await fileClient.downloadToBuffer(); console.log(buffer.toString());
typescriptconst fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt"); await fileClient.delete(); // Delete if exists await fileClient.deleteIfExists();
typescriptconst sourceUrl = "https://account.file.core.windows.net/share/source.txt"; const destFileClient = shareClient.rootDirectoryClient.getFileClient("destination.txt"); // Start copy operation const copyPoller = await destFileClient.startCopyFromURL(sourceUrl); await copyPoller.pollUntilDone();
typescriptconst fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt"); const properties = await fileClient.getProperties(); console.log("Content-Length:", properties.contentLength); console.log("Content-Type:", properties.contentType); console.log("Last Modified:", properties.lastModified); console.log("ETag:", properties.etag);
typescriptawait fileClient.setMetadata({ author: "John Doe", category: "documents", });
typescriptawait fileClient.setHttpHeaders({ fileContentType: "text/plain", fileCacheControl: "max-age=3600", fileContentDisposition: "attachment; filename=download.txt", });
typescriptconst data = Buffer.from("partial content"); await fileClient.uploadRange(data, 100, data.length); // Write at offset 100
typescriptconst downloadResponse = await fileClient.download(100, 50); // offset 100, length 50
typescriptawait fileClient.clearRange(0, 100); // Clear first 100 bytes
typescriptconst snapshotResponse = await shareClient.createSnapshot(); console.log("Snapshot:", snapshotResponse.snapshot);
typescriptconst snapshotShareClient = shareClient.withSnapshot(snapshotResponse.snapshot!); const snapshotFileClient = snapshotShareClient.rootDirectoryClient.getFileClient("file.txt"); const content = await snapshotFileClient.downloadToBuffer();
typescriptawait shareClient.delete({ deleteSnapshots: "include" });
typescriptimport { generateFileSASQueryParameters, FileSASPermissions, StorageSharedKeyCredential, } from "@azure/storage-file-share"; const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey); const sasToken = generateFileSASQueryParameters( { shareName: "my-share", filePath: "my-directory/my-file.txt", permissions: FileSASPermissions.parse("r"), // read only expiresOn: new Date(Date.now() + 3600 * 1000), // 1 hour }, sharedKeyCredential ).toString(); const sasUrl = `https://${accountName}.file.core.windows.net/my-share/my-directory/my-file.txt?${sasToken}`;
typescriptimport { ShareSASPermissions, generateFileSASQueryParameters } from "@azure/storage-file-share"; const sasToken = generateFileSASQueryParameters( { shareName: "my-share", permissions: ShareSASPermissions.parse("rcwdl"), // read, create, write, delete, list expiresOn: new Date(Date.now() + 24 * 3600 * 1000), // 24 hours }, sharedKeyCredential ).toString();
typescriptimport { RestError } from "@azure/storage-file-share"; try { await shareClient.create(); } catch (error) { if (error instanceof RestError) { switch (error.statusCode) { case 404: console.log("Share not found"); break; case 409: console.log("Share already exists"); break; case 403: console.log("Access denied"); break; default: console.error(`Storage error ${error.statusCode}: ${error.message}`); } } throw error; }
typescriptimport { // Clients ShareServiceClient, ShareClient, ShareDirectoryClient, ShareFileClient, // Authentication StorageSharedKeyCredential, AnonymousCredential, // SAS FileSASPermissions, ShareSASPermissions, AccountSASPermissions, AccountSASServices, AccountSASResourceTypes, generateFileSASQueryParameters, generateAccountSASQueryParameters, // Options & Responses ShareCreateResponse, FileDownloadResponseModel, DirectoryItem, FileItem, ShareProperties, FileProperties, // Errors RestError, } from "@azure/storage-file-share";
DefaultAzureCredential for local development; use ManagedIdentityCredential or WorkloadIdentityCredential for productionuploadStream/downloadToFile for files > 256MBRestError.statusCode for specific handling*IfExists methods — For idempotent operations| Feature | Node.js | Browser | |---------|---------|---------| | StorageSharedKeyCredential | ✅ | ❌ | | uploadFile() | ✅ | ❌ | | uploadStream() | ✅ | ❌ | | downloadToFile() | ✅ | ❌ | | downloadToBuffer() | ✅ | ❌ | | SAS generation | ✅ | ❌ | | DefaultAzureCredential | ✅ | ❌ | | Anonymous/SAS access | ✅ | ✅ |
Other measured skills in the registry, with their headline benchmark lift.