One day away from finishing the first 12 (half of the total of 24
)of my Silverlight articles. In this post, we are looking at local file access in Silverlight 4. This new feature is another one that is only enabled with OOB apps with elevated permissions.
In Silverlight 2 and 3, we already had some basic file access. We could perform an OpenFileDialog starting with Silverlight 2. It gave us a read-only stream to the selected file, meaning that the only thing we could do with the file, was reading it and using its contents in the application. Silverlight 3 added the SaveFileDialog, which, surprisingly, allows us to save files to the local disk.
Silverlight 4 ads more or less real local data access. By more or less, I mean that Silverlight applications can only access some folders. More particularly, we can access the My Documents, My Pictures, My Videos and My Music folders (on Mac, an equivalent exists). Within this directory, we can read, create and delete files. One important side-note though: the application needs to be a trusted application, meaning that it needs to run with elevated permissions.
Silverlight has a specific enumeration that we can use to get the physical location of the files: Environment.SpecialFolder. In it, we can find MyPictures etc. Note that it contains more than what we can access at this point, for example ProgramFiles. Even if we try to do something with this, we can’t since Silverlight won’t allow access to this directory.
Let’s take a look at a basic application as shown below.

Let’s first take a look at the left listbox, which is filled with the files of my My Pictures folder. Reading out the files, as well as other operations on the files, are done using the traditional classes contained in the System.IO namespace, such as Directory, File, Path etc. To read out the contents, we use the following code:
if (canWork)
{ var files = Directory.EnumerateFiles(Environment.GetFolderPath
(Environment.SpecialFolder.MyPictures));
foreach (var file in files)
{ string fileName = System.IO.Path.GetFileName(file);
imageNames.Add(fileName);
}
ImageListBox.ItemsSource = imageNames;
}
Note the canWork bool value. Since the application can only work if running OOB and with elevated permissions, we perform a check initially to see if the operations are permitted. The value is set through the following code:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{ //check to see if application is running OOB and with elevated permissions
if (App.Current.IsRunningOutOfBrowser && App.Current.HasElevatedPermissions)
canWork = true;
else
MessageBox.Show("The application needs to run out-of-browser with elevated permissions");
}
The second listbox is filled with all *.txt files, located in my My Documents folder: I’m simply applying a filter.
private void FetchTextFiles()
{ var files = Directory.EnumerateFiles(Environment.GetFolderPath
(Environment.SpecialFolder.MyDocuments))
.Where(filename => filename.EndsWith("txt"));
TextFilesListBox.ItemsSource = files;
}
As said, we can do more than just reading out the contents of a directory. We can for example delete a file. When we select a file in the second listbox, we can delete it using the following code:
private void DeleteButton_Click(object sender, RoutedEventArgs e)
{ if (canWork)
{ if (TextFilesListBox.SelectedItem != null)
{ string path = TextFilesListBox.SelectedItem.ToString();
File.Delete(path);
FetchTextFiles();
}
}
}
As you can see, working with the files is no different than working with files in plain .NET.
The code can be downloaded here: SLLocalFileAccess.zip (68.26 KB)