vb.net and permission issues

I wrote a small program and it takes an access database stored as a resource in my.resources.  On load im telling it to take that db and put it on the local workstation with the below code:

Dim tempFilePath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "BMWMaintenance")
        My.Computer.FileSystem.WriteAllBytes(tempFilePath, My.Resources.BMWMaintenance, False)

Open in new window


IM not sure why but i keep erroring out with a permissions error telling me i dont have rights.  I tried launching as an admin and i still get the same result.  I am an admin of my machine and a domain admin so this should work.  What could be wrong?
derek7467Asked:
Who is Participating?
 
it_saigeDeveloperCommented:
Ok.  I did a little more testing.  The Create method actually opens a filestream.  So we have to close the filestream, then we can WriteAllBytes.
Imports System.IO
Public Class Form1
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim database As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Testing.sdf"))
		Dim fileStream As FileStream
		Try
			If Not database.Exists Then
				fileStream = database.Create()
				fileStream.Close()
				My.Computer.FileSystem.WriteAllBytes(database.FullName, My.Resources.Testing, False)
			End If
		Catch ex As Exception

		End Try
	End Sub
End Class

Open in new window


As for the database resource itself.  I am simply opening the project resources designer and dragging the Database file into it directly -Capture.JPG
The database on the project is currently set with a Build Action of None and Do not copy for the Copy to Ouput Directory property -Capture.JPG
Try with your resources the way that they are first to see if it works for you.

-saige-
0
 
derek7467Author Commented:
To make this more complicated the below code works fine with UAC rights

Dim tempFilePath As String = Combine("C:\Program Files (x86)\BMW Maintenance", "BMWMaintenance.accdb")
        My.Computer.FileSystem.WriteAllBytes(tempFilePath, My.Resources.BMWMaintenance, False)

Open in new window

0
 
it_saigeDeveloperCommented:
Try using CommonApplicationData.

The directory that serves as a common repository for application-specific data that is used by all users.
Source
Dim tempFilePath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "BMWMaintenance")
        My.Computer.FileSystem.WriteAllBytes(tempFilePath, My.Resources.BMWMaintenance, False)

Open in new window


Also what is the error you are receiving?

-saige-
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
derek7467Author Commented:
error is:

An unhandled exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll
Additional information: Access to the path 'C:\ProgramData\BMWMaintenance' is denied

This is with UAC rights built in through app manifest.

Weird thing is i can create the folder fine, its when it tries to copy the db over i get the error
0
 
derek7467Author Commented:
Is there any other way to copy an access db file to another directory?  Right now, im embedding it in my exe and distrbuting it from my.resources
0
 
it_saigeDeveloperCommented:
I'm trying to see if I can replicate your problem.

-saige-
0
 
derek7467Author Commented:
any ideas why the below line always gives me a permissions error?

My.Computer.FileSystem.WriteAllBytes(tempFilePath, My.Resources.BMWMaintenance, False)

Open in new window

0
 
it_saigeDeveloperCommented:
Personally, I have not been able to replicate this issue.  This is what I am doing:
Imports System.IO
Public Class Form1
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim database As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Testing.sdf"))
		If Not database.Exists Then
			database.Create()
			My.Computer.FileSystem.WriteAllBytes(database.FullName, My.Resources.Testing, False)
		End If
	End Sub
End Class

Open in new window


Not that this will make any difference because it does nothing for the security.

However, maybe an application manifest will help:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

-saige-
0
 
derek7467Author Commented:
does that work for you?
0
 
it_saigeDeveloperCommented:
The code, as posted, works for me without any issues.  I do not have to create an application manifest.  However, if you are still presented with a problem, then you might try the application manifest route.

-saige-
0
 
derek7467Author Commented:
it looks like yours is just creating a file, i am trying to copy over an access database that i embedded in my visual studio resources
0
 
it_saigeDeveloperCommented:
I only create the file if it does not exist:
If Not database.Exists Then
	database.Create()

Open in new window

then I write the embedded resource to the file I created:
	My.Computer.FileSystem.WriteAllBytes(database.FullName, My.Resources.Testing, False)

Open in new window

But as I stated, doing this does not resolve issues with access rights.  It's only another method of doing the same thing you are.

-saige-
0
 
derek7467Author Commented:
Well doing it your way actually works without errors, but the file is 0 bytes, meaning nothing was written to it.  How should i store my access db in the resource section?  What should the build action be set to?
0
 
derek7467Author Commented:
that worked you da man!
0
 
derek7467Author Commented:
real quick if youre still here, how do i specify a folder within the localapp directory?

Dim database As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "BMWMaintenance.accdb"))

Id like to store that DB in a specific folder, say "Maintenance"
0
 
it_saigeDeveloperCommented:
You could do something like this:
Imports System.IO

Public Class Form1
	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim location As New DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Maintenance"))
		Dim database As New FileInfo(Path.Combine(location.FullName, "Testing.sdf"))
		Dim fileStream As FileStream
		Try
			If Not location.Exists Then location.Create()
			If Not database.Exists Then
				fileStream = database.Create()
				fileStream.Close()
			End If
			My.Computer.FileSystem.WriteAllBytes(database.FullName, My.Resources.Testing, False)
		Catch ex As Exception

		End Try
	End Sub
End Class

Open in new window


-saige-
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.