Skip to content

Commit 8be5a48

Browse files
Merge pull request #55 from datvm/add-showDirectoryPicker-mode
Added Mode option for BaseDirectoryPickerOptions
2 parents 727c402 + c4cefa6 commit 8be5a48

3 files changed

Lines changed: 124 additions & 1 deletion

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
@page "/OpenDirectory"
2+
@inject IFileSystemAccessServiceInProcess FileSystemAccessService
3+
@inject IJSRuntime Js;
4+
5+
<PageTitle>File System Access - Open Directory</PageTitle>
6+
7+
@if (handler is null)
8+
{
9+
<div class="hstack gap-3">
10+
<label>
11+
<input type="checkbox" @bind="write" />
12+
Write permission
13+
</label>
14+
15+
<button class="btn btn-primary" @onclick="OpenFolderAsync">Pick directory</button>
16+
</div>
17+
}
18+
else
19+
{
20+
<div class="mb-3">
21+
<button class="btn btn-success" disabled="@(!write)" @onclick="WriteHelloWorldAsync">
22+
<span>Create @(FileName)</span>
23+
24+
@if (!write)
25+
{
26+
<span> (no write permission)</span>
27+
}
28+
</button>
29+
</div>
30+
31+
foreach (var item in items)
32+
{
33+
<div>
34+
<span class="oi @(item.Kind == FileSystemHandleKind.Directory ? "oi-folder" : "oi-file")" aria-hidden="true"></span>
35+
@(item.Name)
36+
</div>
37+
}
38+
}
39+
40+
@code {
41+
const string FileName = "HelloWorld.txt";
42+
43+
bool write;
44+
FileSystemDirectoryHandleInProcess? handler;
45+
IFileSystemHandleInProcess[] items = Array.Empty<IFileSystemHandleInProcess>();
46+
47+
async Task OpenFolderAsync()
48+
{
49+
try
50+
{
51+
handler = await FileSystemAccessService.ShowDirectoryPickerAsync(new DirectoryPickerOptionsStartInFileSystemHandle()
52+
{
53+
Mode = write ? FileSystemPermissionMode.ReadWrite : FileSystemPermissionMode.Read,
54+
});
55+
56+
await LoadItemsAsync();
57+
}
58+
catch (Exception ex)
59+
{
60+
Console.WriteLine(ex);
61+
}
62+
}
63+
64+
async Task LoadItemsAsync()
65+
{
66+
items = await handler!.ValuesAsync();
67+
}
68+
69+
async Task WriteHelloWorldAsync()
70+
{
71+
try
72+
{
73+
try
74+
{
75+
var existing = await handler!.GetFileHandleAsync(FileName, new()
76+
{
77+
Create = false,
78+
});
79+
80+
if (existing is not null)
81+
{
82+
await Js.InvokeVoidAsync("alert", "The file is already exist!");
83+
return;
84+
}
85+
}
86+
catch (Exception)
87+
{
88+
// File does not exist
89+
}
90+
91+
var fileHandle = await handler!.GetFileHandleAsync(FileName, new()
92+
{
93+
Create = true,
94+
});
95+
96+
await using (var writable = await fileHandle.CreateWritableAsync())
97+
{
98+
await using var writer = new StreamWriter(writable);
99+
await writer.WriteLineAsync("Hello world");
100+
}
101+
102+
await LoadItemsAsync();
103+
}
104+
catch (Exception ex)
105+
{
106+
Console.WriteLine(ex);
107+
}
108+
}
109+
110+
}

samples/KristofferStrube.Blazor.FileSystemAccess.WasmExample/Shared/NavMenu.razor

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
<span class="oi oi-excerpt" aria-hidden="true"></span> Open File
2020
</NavLink>
2121
</div>
22+
<div class="nav-item px-3">
23+
<NavLink class="nav-link" href="OpenDirectory">
24+
<span class="oi oi-folder" aria-hidden="true"></span> Open Directory
25+
</NavLink>
26+
</div>
2227
<div class="nav-item px-3">
2328
<NavLink class="nav-link" href="ViewZipFile">
2429
<span class="oi oi-box" aria-hidden="true"></span> View Zip File

src/KristofferStrube.Blazor.FileSystemAccess/Options/DirectoryPickerOptions.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public abstract class BaseDirectoryPickerOptions
4545
{
4646
public string? Id { get; set; }
4747

48+
/// <summary>
49+
/// <see href="https://wicg.github.io/file-system-access/#enumdef-filesystempermissionmode">FileSystemPermissionMode browser specs</see>.
50+
/// The default value is <see cref="FileSystemPermissionMode.Read"/>.
51+
/// </summary>
52+
public FileSystemPermissionMode Mode { get; set; } = FileSystemPermissionMode.Read;
53+
4854
internal virtual ExpandoObject Serializable()
4955
{
5056
dynamic res = new ExpandoObject();
@@ -53,6 +59,8 @@ internal virtual ExpandoObject Serializable()
5359
res.id = Id;
5460
}
5561

62+
res.mode = Mode;
63+
5664
return res;
5765
}
58-
}
66+
}

0 commit comments

Comments
 (0)