"App_Data"폴더를 생성 한 Windows 8 저장소 앱이 있습니다. 내가 sqlite 데이터베이스 파일을 추가하고 지금 연결을 만들 파일 경로를 얻으려고하고있어.프로젝트 폴더의 파일에 액세스하려면 어떻게합니까? Windows 8 store app?
답변
내 기존 sqlite 파일을 프로젝트의 공용 폴더에 추가하고 Build Action을 Content로 설정했습니다. 이 파일에 쓸 수 없으므로 응용 프로그램의 로컬 저장소 폴더에 복사해야합니다. 응용 프로그램을 시작할 때 데이터베이스를 초기화하는 StorageManagement 클래스를 만들었습니다.
public static class StorageManagement
{
public static async Task<bool> DoesFileExistAsync(string file)
{
try
{
await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(file);
return true;
}
catch
{
return false;
}
}
public static async void InitializeDatabaseAsync()
{
if (!DoesFileExistAsync("MyDb.sqlite").Result)
{
string databaseFile = Path.Combine(Windows.ApplicationModel.Package.Current.InstalledLocation.Path, @"Common\MyDb.sqlite");
StorageFile file = await StorageFile.GetFileFromPathAsync(databaseFile);
await file.CopyAsync(Windows.Storage.ApplicationData.Current.LocalFolder);
}
}
}
데이터베이스 파일이 로컬 저장소 폴더에없는 경우에만 공용 폴더에서 파일을 복사합니다. 그런 다음 로컬 저장소의 파일을 사용하여 sqlite 연결을 만들 수 있습니다.
프로젝트 폴더에이 "app_data"폴더를 만들었습니까? 앱 격리 저장소에 저장된 파일에만 직접 액세스 할 수 있기 때문에 또는 앱에서 액세스하기 전에 사용자가 파일 피커를 사용하여 파일을 선택해야하므로 작동하지 않습니다.
그래, 나는 이것이 사실이라고 생각했다. 파일의 빌드 작업 속성을 Content로 설정하여 읽기 전용으로 설정할 수있었습니다. 내 경우에는 도움이 안돼. – Nitesh
한 가지 방법은 uri를 파일에 적용한 다음이를 사용하여 파일에 액세스하십시오.
var uri = new Uri("ms-appdata:///local/app_data/database.data");
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
다른 접근법은 ApplicationData 클래스를 사용하는 것입니다.
var folder = await ApplictionData.Current.LocalFolder.GetFolderAsync("app_data");
var file = await folder.GetFileAsync("database.data");
비슷한 문제가있었습니다. 필자는 JSON을 생성하는 서비스를 받기 전에 중간 단계로 앱의 일부로 패키징 될 텍스트 파일에서 JSON을 읽어야했습니다. 이는 app_data 디렉토리에 JSON 파일에서 읽어
var file = await Package.Current.InstalledLocation.GetFileAsync("app_data\\tempjsonfile.json");
String json = await FileIO.ReadTextAsync(file);
을 : 로컬 저장이 여기에 답이 아니었다 사용
는 InstalledLocation는 건과 같이, 응용 프로그램의 일환으로 패키지 파일을 읽기 위해 사용하는 것입니다 나는 프로젝트에서 만들었다. Essential : JSON 파일의 속성에서 Build Action을 'Content'로 설정하고 Output Directory에 'Copy Always'로 설정하십시오.
이 코드를 사용하면 DoesFileExistAsync ("MyDb.sqlite") 결과가 현재 스레드를 차단하게되고 비동기가 아닙니다. –