azure-storage-file-share-ts

安装量: 36
排名: #19314

安装

npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill azure-storage-file-share-ts
@azure/storage-file-share (TypeScript/JavaScript)
SDK for Azure File Share operations — SMB file shares, directories, and file operations.
Installation
npm
install
@azure/storage-file-share @azure/identity
Current Version
12.x
Node.js

= 18.0.0 Environment Variables AZURE_STORAGE_ACCOUNT_NAME = < account-name

AZURE_STORAGE_ACCOUNT_KEY

< account-key

OR connection string

AZURE_STORAGE_CONNECTION_STRING

DefaultEndpointsProtocol

https ; AccountName = .. . Authentication Connection String (Simplest) import { ShareServiceClient } from "@azure/storage-file-share" ; const client = ShareServiceClient . fromConnectionString ( process . env . AZURE_STORAGE_CONNECTION_STRING ! ) ; StorageSharedKeyCredential (Node.js only) import { 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 ) ; DefaultAzureCredential import { ShareServiceClient } from "@azure/storage-file-share" ; import { DefaultAzureCredential } from "@azure/identity" ; const accountName = process . env . AZURE_STORAGE_ACCOUNT_NAME ! ; const client = new ShareServiceClient ( https:// ${ accountName } .file.core.windows.net , new DefaultAzureCredential ( ) ) ; SAS Token import { 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 } ) ; Client Hierarchy ShareServiceClient (account level) └── ShareClient (share level) └── ShareDirectoryClient (directory level) └── ShareFileClient (file level) Share Operations Create Share const shareClient = client . getShareClient ( "my-share" ) ; await shareClient . create ( ) ; // Create with quota (in GB) await shareClient . create ( { quota : 100 } ) ; List Shares for 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 ) ; } Delete Share await shareClient . delete ( ) ; // Delete if exists await shareClient . deleteIfExists ( ) ; Get Share Properties const properties = await shareClient . getProperties ( ) ; console . log ( "Quota:" , properties . quota , "GB" ) ; console . log ( "Last Modified:" , properties . lastModified ) ; Set Share Quota await shareClient . setQuota ( 200 ) ; // 200 GB Directory Operations Create Directory const directoryClient = shareClient . getDirectoryClient ( "my-directory" ) ; await directoryClient . create ( ) ; // Create nested directory const nestedDir = shareClient . getDirectoryClient ( "parent/child/grandchild" ) ; await nestedDir . create ( ) ; List Directories and Files const 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) ) ; } } Delete Directory await directoryClient . delete ( ) ; // Delete if exists await directoryClient . deleteIfExists ( ) ; Check if Directory Exists const exists = await directoryClient . exists ( ) ; if ( ! exists ) { await directoryClient . create ( ) ; } File Operations Upload File (Simple) const 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 ) ; Upload File (Node.js - from local file) import * 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 ) ; Upload File (Buffer) const 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 ) ; Upload File (Stream) import * 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 Download File const 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" ) ; Download to File (Node.js) const fileClient = shareClient . rootDirectoryClient . getFileClient ( "my-file.txt" ) ; await fileClient . downloadToFile ( "/path/to/local/destination.txt" ) ; Download to Buffer (Node.js) const fileClient = shareClient . rootDirectoryClient . getFileClient ( "my-file.txt" ) ; const buffer = await fileClient . downloadToBuffer ( ) ; console . log ( buffer . toString ( ) ) ; Delete File const fileClient = shareClient . rootDirectoryClient . getFileClient ( "my-file.txt" ) ; await fileClient . delete ( ) ; // Delete if exists await fileClient . deleteIfExists ( ) ; Copy File const 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 ( ) ; File Properties & Metadata Get File Properties const 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 ) ; Set Metadata await fileClient . setMetadata ( { author : "John Doe" , category : "documents" , } ) ; Set HTTP Headers await fileClient . setHttpHeaders ( { fileContentType : "text/plain" , fileCacheControl : "max-age=3600" , fileContentDisposition : "attachment; filename=download.txt" , } ) ; Range Operations Upload Range const data = Buffer . from ( "partial content" ) ; await fileClient . uploadRange ( data , 100 , data . length ) ; // Write at offset 100 Download Range const downloadResponse = await fileClient . download ( 100 , 50 ) ; // offset 100, length 50 Clear Range await fileClient . clearRange ( 0 , 100 ) ; // Clear first 100 bytes Snapshot Operations Create Snapshot const snapshotResponse = await shareClient . createSnapshot ( ) ; console . log ( "Snapshot:" , snapshotResponse . snapshot ) ; Access Snapshot const snapshotShareClient = shareClient . withSnapshot ( snapshotResponse . snapshot ! ) ; const snapshotFileClient = snapshotShareClient . rootDirectoryClient . getFileClient ( "file.txt" ) ; const content = await snapshotFileClient . downloadToBuffer ( ) ; Delete Snapshot await shareClient . delete ( { deleteSnapshots : "include" } ) ; SAS Token Generation (Node.js only) Generate File SAS import { 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 } ; Generate Share SAS import { 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 ( ) ; Error Handling import { 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 ; } TypeScript Types Reference import { // 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" ; Best Practices Use connection strings for simplicity — Easiest setup for development Use DefaultAzureCredential for production — Enable managed identity in Azure Set quotas on shares — Prevent unexpected storage costs Use streaming for large files — uploadStream / downloadToFile for files > 256MB Use ranges for partial updates — More efficient than full file replacement Create snapshots before major changes — Point-in-time recovery Handle errors gracefully — Check RestError.statusCode for specific handling Use *IfExists methods — For idempotent operations Platform Differences Feature Node.js Browser StorageSharedKeyCredential ✅ ❌ uploadFile() ✅ ❌ uploadStream() ✅ ❌ downloadToFile() ✅ ❌ downloadToBuffer() ✅ ❌ SAS generation ✅ ❌ DefaultAzureCredential ✅ ❌ Anonymous/SAS access ✅ ✅ When to Use This skill is applicable to execute the workflow or actions described in the overview.

返回排行榜