Comportamento diferente do aplicativo quando implantado localmente e na Store
Estou com um problema estranho quando o aplicativo é implantado na Windows Store (versão beta). O aplicativo foi escrito como Windows Phone 8.1 RunTime.
Eu tenho um pequeno componente de tempo de execução do Windows escrito em C ++ / C # que verifica a existência do arquivo:
bool FileEx::FileExists(String^ path)
{
std::wstring pathW(path->Begin());
std::string myPath(pathW.begin(), pathW.end());
FILE *file = NULL;
if (fopen_s(&file, myPath.c_str(), "r") == 0)
{
fclose(file);
return true;
}
else return false;
}
MÉTODO DE ENSAIO:Agora vamos testá-lo com dois arquivos - um criado na pasta local e outro na pasta MusicLibrary. Tudo é feito no projeto principal, que tem uma referência ao WRC com o método acima em C ++ / C #.
const string localFileName = "local.txt";
const string musicFileName = "music.txt";
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFolder musicFolder = await KnownFolders.MusicLibrary.CreateFolderAsync("MyFolder", CreationCollisionOption.OpenIfExists);
await localFolder.CreateFileAsync(localFileName, CreationCollisionOption.ReplaceExisting); // create local file
await musicFolder.CreateFileAsync(musicFileName, CreationCollisionOption.ReplaceExisting); // create file in MusicLibrary
a) Arquivo local Fist - teste com C # puro:
// First check with C# if file exists - LOCAL FILE
StorageFile checkFile = null;
try { checkFile = await localFolder.GetFileAsync(localFileName); }
catch { checkFile = null; }
if (checkFile != null) await Trace.WriteLineAsync(false, "File exists with path = {0}", checkFile.Path);
else await Trace.WriteLineAsync(false, "File doesn't exist with path = {0}", checkFile.Path);
Segundo com componente escrito:
Exception exc = null;
bool check = false;
try
{
string path = string.Format(@"{0}\{1}", localFolder.Path, localFileName);
await Trace.WriteLineAsync(false, "Attempt with WRC path = {0}", path);
check = FileEx.FileExists(path);
}
catch (Exception ex) { exc = ex; }
if (exc != null) await Trace.WriteLineAsync(false, "Exception WRC");
else await Trace.WriteLineAsync(false, "No exception WRC, file exists = {0}", check);
b) O mesmo com o arquivo na pasta da biblioteca de músicas:
Punho - teste com C # puro:
checkFile = null;
try { checkFile = await musicFolder.GetFileAsync(musicFileName); }
catch { checkFile = null; }
if (checkFile != null) await Trace.WriteLineAsync(false, "File exists with path = {0}", checkFile.Path);
else await Trace.WriteLineAsync(false, "File doesn't exist with path = {0}", checkFile.Path);
Segundo com componente escrito:
check = false;
exc = null;
try
{
string path = string.Format(@"{0}\{1}", musicFolder.Path, musicFileName);
await Trace.WriteLineAsync(false, "Attempt with WRC path = {0}", path);
check = FileEx.FileExists(path);
}
catch (Exception ex) { exc = ex; }
if (exc != null) await Trace.WriteLineAsync(false, "Exception WRC");
else await Trace.WriteLineAsync(false, "No exception WRC, file exists = {0}", check);
RESULTADOS:Não há exceção em nenhum caso, como mostram os métodos C # puros, os dois arquivos existem após sua criação. Como você pode ver nas fotos anexadas abaixo, quando o aplicativo é implantado via Visual Studio, ele funciona corretamente, o componente de tempo de execução mostra os dois arquivos, mas quando o aplicativo é baixado da loja, a situação é diferente - o método WRC funciona para arquivos locais, mas não para estes na MusicLibrary.
Nos dois casos, os caminhos dos arquivos são os mesmos; em ambas as implantações, o componente de tempo de execução funciona; portanto, o primeiro arquivo existe. Parece que o componente runtime do Windows não tem acesso ao MusicLibrary, apesar de todos os recursos necessários estarem definidospackageappx.manifest arquivo (implantação local funciona).
Alguém tem uma idéia de por que o componente Windows Runtime não tem acesso a um arquivo no MusicLibrary? O componente de tempo de execução do Windows precisa de alguns recursos adicionais?
Alguma maneira de fazê-lo funcionar?