opción
HogarHogar Skill DevOps y CI/CD azure-storage-file-share-ts

azure-storage-file-share-ts

microsoft/skills microsoft/skills

Gestione las comparticiones de archivos de Azure mediante el SDK oficial de TypeScript/JavaScript. Cree y elimine comparticiones, directorios y archivos; cargue, descargue y copie archivos; establezca metadatos y encabezados HTTP.

...Expandir todo
0
Tiempo actualizado 16 de septiembre de 2026

@azure/storage-file-share (TypeScript/JavaScript)

SDK para operaciones de Azure File Share: comparticiones de archivos SMB, directorios y operaciones de archivos.

Instalación

npm install @azure/storage-file-share @azure/identity

Versión actual: 12.x
Node.js: >= 18.0.0

Variables de entorno

AZURE_STORAGE_ACCOUNT_NAME=<nombre-cuenta>
AZURE_STORAGE_ACCOUNT_KEY=<clave-cuenta>
# O cadena de conexión
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
AZURE_TOKEN_CREDENTIALS=prod # Solo es necesario si se usa DefaultAzureCredential en producción
</clave-cuenta></nombre-cuenta>

Autenticación

Cadena de conexión (Más simple)

import { ShareServiceClient } from "@azure/storage-file-share";

const client = ShareServiceClient.fromConnectionString(
  process.env.AZURE_STORAGE_CONNECTION_STRING!
);

StorageSharedKeyCredential (Solo Node.js)

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
);

Credencial de token de Microsoft Entra

import { ShareServiceClient } from "@azure/storage-file-share";
import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity";

// Desarrollo local: DefaultAzureCredential. Producción: establecer AZURE_TOKEN_CREDENTIALS=prod o AZURE_TOKEN_CREDENTIALS=<credencial_específica>
const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});
// O usar una credencial específica directamente en producción:
// Consulte 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
);
</credencial_específica>

Token SAS

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}`
);

Jerarquía de clientes

ShareServiceClient (nivel de cuenta)
└── ShareClient (nivel de compartición)
    └── ShareDirectoryClient (nivel de directorio)
        └── ShareFileClient (nivel de archivo)

Operaciones de compartición

Crear compartición

const shareClient = client.getShareClient("mi-comparticion");
await shareClient.create();

// Crear con cuota (en GB)
await shareClient.create({ quota: 100 });

Listar comparticiones

for await (const share of client.listShares()) {
  console.log(share.name, share.properties.quota);
}

// Con filtro de prefijo
for await (const share of client.listShares({ prefix: "registros-" })) {
  console.log(share.name);
}

Eliminar compartición

await shareClient.delete();

// Eliminar si existe
await shareClient.deleteIfExists();

Obtener propiedades de la compartición

const properties = await shareClient.getProperties();
console.log("Cuota:", properties.quota, "GB");
console.log("Última modificación:", properties.lastModified);

Establecer cuota de la compartición

await shareClient.setQuota(200); // 200 GB

Operaciones de directorio

Crear directorio

const directoryClient = shareClient.getDirectoryClient("mi-directorio");
await directoryClient.create();

// Crear directorio anidado
const nestedDir = shareClient.getDirectoryClient("padre/hijo/nieto");
await nestedDir.create();

Listar directorios y archivos

const directoryClient = shareClient.getDirectoryClient("mi-directorio");

for await (const item of directoryClient.listFilesAndDirectories()) {
  if (item.kind === "directory") {
    console.log(`[DIR] ${item.name}`);
  } else {
    console.log(`[ARCHIVO] ${item.name} (${item.properties.contentLength} bytes)`);
  }
}

Eliminar directorio

await directoryClient.delete();

// Eliminar si existe
await directoryClient.deleteIfExists();

Comprobar si el directorio existe

const exists = await directoryClient.exists();
if (!exists) {
  await directoryClient.create();
}

Operaciones de archivo

Subir archivo (Simple)

const fileClient = shareClient
  .getDirectoryClient("mi-directorio")
  .getFileClient("mi-archivo.txt");

// Subir cadena de texto
const content = "Hola, Mundo!";
await fileClient.create(content.length);
await fileClient.uploadRange(content, 0, content.length);

Subir archivo (Node.js - desde archivo local)

import * as fs from "fs";
import * as path from "path";

const fileClient = shareClient.rootDirectoryClient.getFileClient("subido.txt");
const localFilePath = "/ruta/al/archivo/local.txt";
const fileSize = fs.statSync(localFilePath).size;

await fileClient.create(fileSize);
await fileClient.uploadFile(localFilePath);

Subir archivo (Buffer)

const buffer = Buffer.from("Hola, Archivos de Azure!");
const fileClient = shareClient.rootDirectoryClient.getFileClient("archivo-buffer.txt");

await fileClient.create(buffer.length);
await fileClient.uploadRange(buffer, 0, buffer.length);

Subir archivo (Flujo)

import * as fs from "fs";

const fileClient = shareClient.rootDirectoryClient.getFileClient("transmitido.txt");
const readStream = fs.createReadStream("/ruta/al/archivo/local.txt");
const fileSize = fs.statSync("/ruta/al/archivo/local.txt").size;

await fileClient.create(fileSize);
await fileClient.uploadStream(readStream, fileSize, 4 * 1024 * 1024, 4); // Buffer de 4MB, concurrencia 4

Descargar archivo

const fileClient = shareClient
  .getDirectoryClient("mi-directorio")
  .getFileClient("mi-archivo.txt");

const downloadResponse = await fileClient.download();

// Leer como cadena de texto
const chunks: Buffer[] = [];
for await (const chunk of downloadResponse.readableStreamBody!) {
  chunks.push(Buffer.from(chunk));
}
const content = Buffer.concat(chunks).toString("utf-8");

Descargar a archivo (Node.js)

const fileClient = shareClient.rootDirectoryClient.getFileClient("mi-archivo.txt");
await fileClient.downloadToFile("/ruta/al/destino/local.txt");

Descargar a buffer (Node.js)

const fileClient = shareClient.rootDirectoryClient.getFileClient("mi-archivo.txt");
const buffer = await fileClient.downloadToBuffer();
console.log(buffer.toString());

Eliminar archivo

const fileClient = shareClient.rootDirectoryClient.getFileClient("mi-archivo.txt");
await fileClient.delete();

// Eliminar si existe
await fileClient.deleteIfExists();

Copiar archivo

const sourceUrl = "https://cuenta.file.core.windows.net/comparticion/origen.txt";
const destFileClient = shareClient.rootDirectoryClient.getFileClient("destino.txt");

// Iniciar operación de copia
const copyPoller = await destFileClient.startCopyFromURL(sourceUrl);
await copyPoller.pollUntilDone();

Propiedades y metadatos del archivo

Obtener propiedades del archivo

const fileClient = shareClient.rootDirectoryClient.getFileClient("mi-archivo.txt");
const properties = await fileClient.getProperties();

console.log("Longitud del contenido:", properties.contentLength);
console.log("Tipo de contenido:", properties.contentType);
console.log("Última modificación:", properties.lastModified);
console.log("ETag:", properties.etag);

Establecer metadatos

await fileClient.setMetadata({
  author: "Juan Pérez",
  category: "documentos",
});

Establecer encabezados HTTP

await fileClient.setHttpHeaders({
  fileContentType: "text/plain",
  fileCacheControl: "max-age=3600",
  fileContentDisposition: "attachment; filename=descarga.txt",
});

Operaciones de rango

Subir rango

const data = Buffer.from("contenido parcial");
await fileClient.uploadRange(data, 100, data.length); // Escribir en el desplazamiento 100

Descargar rango

const downloadResponse = await fileClient.download(100, 50); // Desplazamiento 100, longitud 50

Limpiar rango

await fileClient.clearRange(0, 100); // Limpiar los primeros 100 bytes

Operaciones de instantánea

Crear instantánea

const snapshotResponse = await shareClient.createSnapshot();
console.log("Instantánea:", snapshotResponse.snapshot);

Acceder a instantánea

const snapshotShareClient = shareClient.withSnapshot(snapshotResponse.snapshot!);
const snapshotFileClient = snapshotShareClient.rootDirectoryClient.getFileClient("archivo.txt");
const content = await snapshotFileClient.downloadToBuffer();

Eliminar instantánea

await shareClient.delete({ deleteSnapshots: "include" });

Generación de token SAS (Solo Node.js)

Generar token SAS de archivo

import {
  generateFileSASQueryParameters,
  FileSASPermissions,
  StorageSharedKeyCredential,
} from "@azure/storage-file-share";

const sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);

const sasToken = generateFileSASQueryParameters(
  {
    shareName: "mi-comparticion",
    filePath: "mi-directorio/mi-archivo.txt",
    permissions: FileSASPermissions.parse("r"), // solo lectura
    expiresOn: new Date(Date.now() + 3600 * 1000), // 1 hora
  },
  sharedKeyCredential
).toString();

const sasUrl = `https://${accountName}.file.core.windows.net/mi-comparticion/mi-directorio/mi-archivo.txt?${sasToken}`;

Generar token SAS de compartición

import { ShareSASPermissions, generateFileSASQueryParameters } from "@azure/storage-file-share";

const sasToken = generateFileSASQueryParameters(
  {
    shareName: "mi-comparticion",
    permissions: ShareSASPermissions.parse("rcwdl"), // lectura, creación, escritura, eliminación, listado
    expiresOn: new Date(Date.now() + 24 * 3600 * 1000), // 24 horas
  },
  sharedKeyCredential
).toString();

Manejo de errores

import { RestError } from "@azure/storage-file-share";

try {
  await shareClient.create();
} catch (error) {
  if (error instanceof RestError) {
    switch (error.statusCode) {
      case 404:
        console.log("Compartición no encontrada");
        break;
      case 409:
        console.log("La compartición ya existe");
        break;
      case 403:
        console.log("Acceso denegado");
        break;
      default:
        console.error(`Error de almacenamiento ${error.statusCode}: ${error.message}`);
    }
  }
  throw error;
}

Referencia de tipos TypeScript

import {
  // Clientes
  ShareServiceClient,
  ShareClient,
  ShareDirectoryClient,
  ShareFileClient,

  // Autenticación
  StorageSharedKeyCredential,
  AnonymousCredential,

  // SAS
  FileSASPermissions,
  ShareSASPermissions,
  AccountSASPermissions,
  AccountSASServices,
  AccountSASResourceTypes,
  generateFileSASQueryParameters,
  generateAccountSASQueryParameters,

  // Opciones y respuestas
  ShareCreateResponse,
  FileDownloadResponseModel,
  DirectoryItem,
  FileItem,
  ShareProperties,
  FileProperties,

  // Errores
  RestError,
} from "@azure/storage-file-share";

Mejores prácticas

  1. Usar cadenas de conexión para mayor simplicidad: Configuración más fácil para desarrollo
  2. Usar DefaultAzureCredential para desarrollo local; usar ManagedIdentityCredential o WorkloadIdentityCredential para producción
  3. Establecer cuotas en las comparticiones: Evitar costos de almacenamiento inesperados
  4. Usar streaming para archivos grandes: uploadStream/downloadToFile para archivos > 256MB
  5. Usar rangos para actualizaciones parciales: Más eficiente que reemplazar el archivo completo
  6. Crear instantáneas antes de cambios importantes: Recuperación en un punto específico en el tiempo
  7. Manejar errores de forma elegante: Comprobar RestError.statusCode para un manejo específico
  8. *Usar métodos `IfExists`**: Para operaciones idempotentes

Diferencias entre plataformas

FunciónNode.jsNavegador
`StorageSharedKeyCredential`
`uploadFile()`
`uploadStream()`
`downloadToFile()`
`downloadToBuffer()`
Generación de SAS
DefaultAzureCredential
Acceso anónimo/SAS
Ver en GitHub
---
name: azure-storage-file-share-ts
description: Manage Azure File Shares using the official TypeScript/JavaScript SDK. Create and delete shares, directories, and files; upload, download, and copy files; set metadata and HTTP headers.
license: MIT
---

# @azure/storage-file-share (TypeScript/JavaScript)

SDK for Azure File Share operations — SMB file shares, directories, and file operations.

## Installation

```bash
npm install @azure/storage-file-share @azure/identity
```

**Current Version**: 12.x  
**Node.js**: >= 18.0.0

## Environment Variables

```bash
AZURE_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
```

## Authentication

### Connection String (Simplest)

```typescript
import { ShareServiceClient } from "@azure/storage-file-share";

const client = ShareServiceClient.fromConnectionString(
  process.env.AZURE_STORAGE_CONNECTION_STRING!
);
```

### StorageSharedKeyCredential (Node.js only)

```typescript
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
);
```

### Microsoft Entra Token Credential

```typescript
import { 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
);
```

### SAS Token

```typescript
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

```typescript
const shareClient = client.getShareClient("my-share");
await shareClient.create();

// Create with quota (in GB)
await shareClient.create({ quota: 100 });
```

### List Shares

```typescript
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

```typescript
await shareClient.delete();

// Delete if exists
await shareClient.deleteIfExists();
```

### Get Share Properties

```typescript
const properties = await shareClient.getProperties();
console.log("Quota:", properties.quota, "GB");
console.log("Last Modified:", properties.lastModified);
```

### Set Share Quota

```typescript
await shareClient.setQuota(200); // 200 GB
```

## Directory Operations

### Create Directory

```typescript
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

```typescript
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

```typescript
await directoryClient.delete();

// Delete if exists
await directoryClient.deleteIfExists();
```

### Check if Directory Exists

```typescript
const exists = await directoryClient.exists();
if (!exists) {
  await directoryClient.create();
}
```

## File Operations

### Upload File (Simple)

```typescript
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)

```typescript
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)

```typescript
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)

```typescript
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

```typescript
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)

```typescript
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
await fileClient.downloadToFile("/path/to/local/destination.txt");
```

### Download to Buffer (Node.js)

```typescript
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
const buffer = await fileClient.downloadToBuffer();
console.log(buffer.toString());
```

### Delete File

```typescript
const fileClient = shareClient.rootDirectoryClient.getFileClient("my-file.txt");
await fileClient.delete();

// Delete if exists
await fileClient.deleteIfExists();
```

### Copy File

```typescript
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

```typescript
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

```typescript
await fileClient.setMetadata({
  author: "John Doe",
  category: "documents",
});
```

### Set HTTP Headers

```typescript
await fileClient.setHttpHeaders({
  fileContentType: "text/plain",
  fileCacheControl: "max-age=3600",
  fileContentDisposition: "attachment; filename=download.txt",
});
```

## Range Operations

### Upload Range

```typescript
const data = Buffer.from("partial content");
await fileClient.uploadRange(data, 100, data.length); // Write at offset 100
```

### Download Range

```typescript
const downloadResponse = await fileClient.download(100, 50); // offset 100, length 50
```

### Clear Range

```typescript
await fileClient.clearRange(0, 100); // Clear first 100 bytes
```

## Snapshot Operations

### Create Snapshot

```typescript
const snapshotResponse = await shareClient.createSnapshot();
console.log("Snapshot:", snapshotResponse.snapshot);
```

### Access Snapshot

```typescript
const snapshotShareClient = shareClient.withSnapshot(snapshotResponse.snapshot!);
const snapshotFileClient = snapshotShareClient.rootDirectoryClient.getFileClient("file.txt");
const content = await snapshotFileClient.downloadToBuffer();
```

### Delete Snapshot

```typescript
await shareClient.delete({ deleteSnapshots: "include" });
```

## SAS Token Generation (Node.js only)

### Generate File SAS

```typescript
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

```typescript
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

```typescript
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

```typescript
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

1. **Use connection strings for simplicity** — Easiest setup for development
2. **Use `DefaultAzureCredential` for local development; use `ManagedIdentityCredential` or `WorkloadIdentityCredential` for production**
3. **Set quotas on shares** — Prevent unexpected storage costs
4. **Use streaming for large files** — `uploadStream`/`downloadToFile` for files > 256MB
5. **Use ranges for partial updates** — More efficient than full file replacement
6. **Create snapshots before major changes** — Point-in-time recovery
7. **Handle errors gracefully** — Check `RestError.statusCode` for specific handling
8. **Use `*IfExists` methods** — For idempotent operations

## Platform Differences

| Feature | Node.js | Browser |
|---------|---------|---------|
| `StorageSharedKeyCredential` | ✅ | ❌ |
| `uploadFile()` | ✅ | ❌ |
| `uploadStream()` | ✅ | ❌ |
| `downloadToFile()` | ✅ | ❌ |
| `downloadToBuffer()` | ✅ | ❌ |
| SAS generation | ✅ | ❌ |
| DefaultAzureCredential | ✅ | ❌ |
| Anonymous/SAS access | ✅ | ✅ |

Todos los archivos

1 archivos

Instalar azure-storage-file-share-ts

Descarga y extrae los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-typescript/skills/azure-storage-file-share-ts # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copie la carpeta de la habilidad a .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio microsoft/skills

Habilidades relacionadas

base44-cli
Tiempo actualizado 29 de junio de 2026
klingai-upgrade-migration
Tiempo actualizado 3 de julio de 2026
Railway CLI Management
Tiempo actualizado 2 de julio de 2026
Verification &amp; Quality Assurance
Tiempo actualizado 29 de junio de 2026
OR