Rewrote sync_microsoft_skills.py (v4) to use each SKILL.md's frontmatter 'name' field as the flat directory name under skills/, replacing the nested skills/official/microsoft/<lang>/<category>/<service>/ hierarchy. This fixes CI failures caused by the indexing, validation, and catalog scripts expecting skills/<id>/SKILL.md (depth 1). Changes: - Rewrite scripts/sync_microsoft_skills.py for flat output with collision detection - Update scripts/tests/inspect_microsoft_repo.py for flat name mapping - Update scripts/tests/test_comprehensive_coverage.py for name uniqueness checks - Delete skills/official/ nested directory - Add 129 Microsoft skills as flat directories (e.g. skills/azure-mgmt-botservice-dotnet/) - Move attribution files to docs/ (LICENSE-MICROSOFT, microsoft-skills-attribution.json) - Rebuild skills_index.json, CATALOG.md, README.md (845 total skills)
239 lines
4.9 KiB
Markdown
239 lines
4.9 KiB
Markdown
---
|
|
name: azure-storage-file-share-py
|
|
description: |
|
|
Azure Storage File Share SDK for Python. Use for SMB file shares, directories, and file operations in the cloud.
|
|
Triggers: "azure-storage-file-share", "ShareServiceClient", "ShareClient", "file share", "SMB".
|
|
---
|
|
|
|
# Azure Storage File Share SDK for Python
|
|
|
|
Manage SMB file shares for cloud-native and lift-and-shift scenarios.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
pip install azure-storage-file-share
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
```bash
|
|
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...
|
|
# Or
|
|
AZURE_STORAGE_ACCOUNT_URL=https://<account>.file.core.windows.net
|
|
```
|
|
|
|
## Authentication
|
|
|
|
### Connection String
|
|
|
|
```python
|
|
from azure.storage.fileshare import ShareServiceClient
|
|
|
|
service = ShareServiceClient.from_connection_string(
|
|
os.environ["AZURE_STORAGE_CONNECTION_STRING"]
|
|
)
|
|
```
|
|
|
|
### Entra ID
|
|
|
|
```python
|
|
from azure.storage.fileshare import ShareServiceClient
|
|
from azure.identity import DefaultAzureCredential
|
|
|
|
service = ShareServiceClient(
|
|
account_url=os.environ["AZURE_STORAGE_ACCOUNT_URL"],
|
|
credential=DefaultAzureCredential()
|
|
)
|
|
```
|
|
|
|
## Share Operations
|
|
|
|
### Create Share
|
|
|
|
```python
|
|
share = service.create_share("my-share")
|
|
```
|
|
|
|
### List Shares
|
|
|
|
```python
|
|
for share in service.list_shares():
|
|
print(f"{share.name}: {share.quota} GB")
|
|
```
|
|
|
|
### Get Share Client
|
|
|
|
```python
|
|
share_client = service.get_share_client("my-share")
|
|
```
|
|
|
|
### Delete Share
|
|
|
|
```python
|
|
service.delete_share("my-share")
|
|
```
|
|
|
|
## Directory Operations
|
|
|
|
### Create Directory
|
|
|
|
```python
|
|
share_client = service.get_share_client("my-share")
|
|
share_client.create_directory("my-directory")
|
|
|
|
# Nested directory
|
|
share_client.create_directory("my-directory/sub-directory")
|
|
```
|
|
|
|
### List Directories and Files
|
|
|
|
```python
|
|
directory_client = share_client.get_directory_client("my-directory")
|
|
|
|
for item in directory_client.list_directories_and_files():
|
|
if item["is_directory"]:
|
|
print(f"[DIR] {item['name']}")
|
|
else:
|
|
print(f"[FILE] {item['name']} ({item['size']} bytes)")
|
|
```
|
|
|
|
### Delete Directory
|
|
|
|
```python
|
|
share_client.delete_directory("my-directory")
|
|
```
|
|
|
|
## File Operations
|
|
|
|
### Upload File
|
|
|
|
```python
|
|
file_client = share_client.get_file_client("my-directory/file.txt")
|
|
|
|
# From string
|
|
file_client.upload_file("Hello, World!")
|
|
|
|
# From file
|
|
with open("local-file.txt", "rb") as f:
|
|
file_client.upload_file(f)
|
|
|
|
# From bytes
|
|
file_client.upload_file(b"Binary content")
|
|
```
|
|
|
|
### Download File
|
|
|
|
```python
|
|
file_client = share_client.get_file_client("my-directory/file.txt")
|
|
|
|
# To bytes
|
|
data = file_client.download_file().readall()
|
|
|
|
# To file
|
|
with open("downloaded.txt", "wb") as f:
|
|
data = file_client.download_file()
|
|
data.readinto(f)
|
|
|
|
# Stream chunks
|
|
download = file_client.download_file()
|
|
for chunk in download.chunks():
|
|
process(chunk)
|
|
```
|
|
|
|
### Get File Properties
|
|
|
|
```python
|
|
properties = file_client.get_file_properties()
|
|
print(f"Size: {properties.size}")
|
|
print(f"Content type: {properties.content_settings.content_type}")
|
|
print(f"Last modified: {properties.last_modified}")
|
|
```
|
|
|
|
### Delete File
|
|
|
|
```python
|
|
file_client.delete_file()
|
|
```
|
|
|
|
### Copy File
|
|
|
|
```python
|
|
source_url = "https://account.file.core.windows.net/share/source.txt"
|
|
dest_client = share_client.get_file_client("destination.txt")
|
|
dest_client.start_copy_from_url(source_url)
|
|
```
|
|
|
|
## Range Operations
|
|
|
|
### Upload Range
|
|
|
|
```python
|
|
# Upload to specific range
|
|
file_client.upload_range(data=b"content", offset=0, length=7)
|
|
```
|
|
|
|
### Download Range
|
|
|
|
```python
|
|
# Download specific range
|
|
download = file_client.download_file(offset=0, length=100)
|
|
data = download.readall()
|
|
```
|
|
|
|
## Snapshot Operations
|
|
|
|
### Create Snapshot
|
|
|
|
```python
|
|
snapshot = share_client.create_snapshot()
|
|
print(f"Snapshot: {snapshot['snapshot']}")
|
|
```
|
|
|
|
### Access Snapshot
|
|
|
|
```python
|
|
snapshot_client = service.get_share_client(
|
|
"my-share",
|
|
snapshot=snapshot["snapshot"]
|
|
)
|
|
```
|
|
|
|
## Async Client
|
|
|
|
```python
|
|
from azure.storage.fileshare.aio import ShareServiceClient
|
|
from azure.identity.aio import DefaultAzureCredential
|
|
|
|
async def upload_file():
|
|
credential = DefaultAzureCredential()
|
|
service = ShareServiceClient(account_url, credential=credential)
|
|
|
|
share = service.get_share_client("my-share")
|
|
file_client = share.get_file_client("test.txt")
|
|
|
|
await file_client.upload_file("Hello!")
|
|
|
|
await service.close()
|
|
await credential.close()
|
|
```
|
|
|
|
## Client Types
|
|
|
|
| Client | Purpose |
|
|
|--------|---------|
|
|
| `ShareServiceClient` | Account-level operations |
|
|
| `ShareClient` | Share operations |
|
|
| `ShareDirectoryClient` | Directory operations |
|
|
| `ShareFileClient` | File operations |
|
|
|
|
## Best Practices
|
|
|
|
1. **Use connection string** for simplest setup
|
|
2. **Use Entra ID** for production with RBAC
|
|
3. **Stream large files** using chunks() to avoid memory issues
|
|
4. **Create snapshots** before major changes
|
|
5. **Set quotas** to prevent unexpected storage costs
|
|
6. **Use ranges** for partial file updates
|
|
7. **Close async clients** explicitly
|