2016-12-30 93 views
0

我目前正在为gravesite的访问者信息站开发一个应用程序,其中一个功能从csv文件中提取数据并使用所述数据来填充列表视图。下面的代码是获取数据并将其返回到列表类型严重程度的代码。从ApplicationData.Current.LocalFolder切换到Knownfolders.DocumentsLibrary

public class Grave 
    { 
     public string plots { get; set; } 
     public string DOBS { get; set; } 
     public string lastNames { get; set; } 
     public string firstNames { get; set; } 
     public string companys { get; set; } 
     public string regts { get; set; } 
     public string unitTypes { get; set; } 
     public string states { get; set; } 
     public string ranks { get; set; } 
     public string sections { get; set; } 
     public string image { get; set; } 
     public string text { get; set; } 
     public string notenums { get; set; } 
    } 



public class GraveManager 
{ 



    public static List<Grave> GetGrave() 
    { //points to desired folder 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 

     string csvPath = folder.Path + @"\PGexcel.csv"; 
     //loads .csv file from folder 
     Csv csv = new Csv(); 

     //property that tells csv parser to not treat the first row as data 
     csv.HasColumnNames = true; 

     bool success1; 
     success1 = csv.LoadFile(csvPath); 

     //name of columns 
     string plot = "Plot", DOB = "Date_of_Death", lastName = "Last_Name", firstName = "First_Name", company = "Company", regt = "Regt", state = "State", unitType = "Unit_Type", Rank = "Rank", Section = "Section", Notables= "Notables"; 


     //initialize string of arrays for each column 
     string[] OCplots = new string[csv.NumRows]; 
     string[] OCDOBS = new string[csv.NumRows]; 
     string[] OClastNames = new string[csv.NumRows]; 
     string[] OCfirstNames = new string[csv.NumRows]; 
     string[] OCcompanys = new string[csv.NumRows]; 
     string[] OCregts = new string[csv.NumRows]; 
     string[] OCunitTypes = new string[csv.NumRows]; 
     string[] OCstates = new string[csv.NumRows]; 
     string[] OCranks = new string[csv.NumRows]; 
     string[] OCsections = new string[csv.NumRows]; 
     string[] OCimage = new string[csv.NumRows]; 
     string[] OCtext = new string[csv.NumRows]; 
     string[] OCnotenums = new string[csv.NumRows]; 


     //populates the arrays with values from .csv file 
     for (int i = 0; i < csv.NumRows; i++) 
     { 

      OCplots[i] = csv.GetCellByName(i, plot); 
      OCDOBS[i] = csv.GetCellByName(i, DOB); 
      OClastNames[i] = csv.GetCellByName(i, lastName); 
      OCfirstNames[i] = csv.GetCellByName(i, firstName); 
      OCcompanys[i] = csv.GetCellByName(i, company); 
      OCregts[i] = csv.GetCellByName(i, regt); 
      OCunitTypes[i] = csv.GetCellByName(i, unitType); 
      OCranks[i] = csv.GetCellByName(i, Rank); 
      OCsections[i] = csv.GetCellByName(i, Section); 
      OCstates[i] = csv.GetCellByName(i, state); 
      OCnotenums[i] = csv.GetCellByName(i, Notables); 
     } 



     //concantenate arrays with .jpg .txt to call for corresponding files 
     for (int i = 0; i < csv.NumRows; i++) 
     { 
      //OCimage[i] = "C:/Users/POGR_ADMIN/AppData/Local/Packages/6b3614f6-6a5f-48fc-9687-80291e70b64d_phwtyg9y34v1t/LocalState/" + OCplots[i] + ".jpg"; 
      OCimage[i] = folder.Path + @"\" + OCplots[i] + ".jpg"; 
      OCtext[i] = folder.Path + @"\"+ OCplots[i] + ".txt"; 
     } 

     var graves = new List<Grave>(); 



     //attempt to populate List using the for loop 
     for (int i = 0; i < csv.NumRows; i++) 
     { 
      graves.Add(new Grave { plots= OCplots[i], DOBS = OCDOBS[i], lastNames = OClastNames[i], firstNames = OCfirstNames[i], companys = OCcompanys[i], regts = OCregts[i], states = OCstates[i], unitTypes = OCunitTypes[i],ranks = OCranks[i], sections = OCsections[i], image = OCimage[i], text = OCtext[i], notenums = OCnotenums[i] }); 

     } 




     return graves;    

    } 
} 

我那么另一页上初始化列表类型的坟墓,并通过调用方法时调用构造函数填充它。这是显示在这里:

public List<Grave> Graves; 

    public FindaGrave() 
    { 
     this.InitializeComponent(); 
     GraveInitializer(); 

    } 

    public void GraveInitializer() 
    { 
     Graves = GraveManager.GetGrave(); 
    } 

此代码工作完美和罚款,并完全填充listview我如何设想。但是,我注意到,csv文件中有许多错误,他们发现并计划由于人为错误而找到这些错误。据说,他们希望能够对csv文件进行更改,并且在重新加载应用程序(没有任何帮助)后显示更改。由于当地国家的文件夹被包装我认为应该做的唯一方式,以便将改变 StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFolder folder = KnownFolders.DocumentsLibrary;

我觉得,如果我确信该文件是文档库中,增加了功能,在应用程序包的清单像<uap:Capability Name="documentsLibrary" />这样,并添加相应的文件类型关联,它应该工作相同。但是,当我运行它时,列表不再显示出来,并且在我稍微调试一下后,folder.Pathstring csvPath的值就不再等于“\ PGexcel.csv”。我完全失去了,因为我认为会是一个快速解决方案最终成为一件非常困难的事情,而且我是UWP的新手,所以没有任何帮助。我查找了几天,无法找到解决方案,对此问题的任何帮助将不胜感激。你会成为一个拯救生命的人!

+0

之前我们要潜入你的问题。您是否知道文件夹的功能受到限制,如果想要提交给商店,最好不要使用它?来源:https://msdn.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations –

+0

我明白,最好不要使用它,但这个应用程序将被侧载,并不会有去商店,所以它真的没关系。@DaveSmits –

回答

0

oke我检查了你的代码,问题在于UWP应用程序是沙箱类型的,只能访问ApplicationData。即使您设法在应用程序数据之外获得完整路径,也无法将其打开。您需要通过KnownFolders类打开它们或将它们保存在StorageApplicationPermissions类中

最好的方法是使用Storiage Api打开文件流并将它传递给您的csv解析器,但我不确定您的csv解析器是否接受流

+0

DocumentsLibrary是已知文件夹类的一部分。而csv解析器接受一个字符串作为路径。你能展示一个使用存储API的例子吗? @DaveSmits –

+0

另外,因为它是在已知的文件夹类是没有办法使用它?如果是这种情况,我觉得它很愚蠢,他们甚至会将它作为一个选项,而不考虑放置的限制,特别是如果它是一个侧装应用@DaveSmits –

0

因为UWP应用程序需要安全,所以不允许他们直接使用路径访问非应用程序数据文件系统位置。

尽管如此,您仍然可以使用StorageFile API,如果您的CSV库支持字符串输入而不是文件,则应该足够了。

public static async Task<List<Grave>> GetGraveAsync() 
{ 
    //points to desired folder 
    StorageFolder folder = ApplicationData.Current.LocalFolder; 
    //find the file 
    StorageFile csvFile = await folder.GetFileAsync("PGexcel.csv"); 


    //loads .csv file from folder 
    Csv csv = new Csv(); 

    //property that tells csv parser to not treat the first row as data 
    csv.HasColumnNames = true; 

    bool success1; 

    //load the CSV data from string 
    success1 = csv.LoadFromString(await FileIO.ReadAllText(csvFile)); 

    //... rest of your code 

    return graves;    
} 

StorageApplicationPermissions.FutureAccessList

您的问题最简单的解决办法是让用户选择上首先推出使用FileOpenPicker应用程序的文件,然后保存它使用StorageApplicationPermissions.FutureAccessList API。此API允许您将访问权限保存到1000个存储项目,以便您可以访问用户选择的文件。即使在应用的多次发布中也是如此。

+0

功能明智。这段代码和我的原始代码有什么区别?他们仍然无法进行更新或在需要时替换csv文件,因为他们无法访问本地状态文件夹。这是我一直在寻找方法使其进入文档文件夹的唯一原因,因为这是唯一的文件夹,将允许它 –

+1

你的版本和这个之间的区别是,你应该实际上能够以这种方式访问​​文件如果您声明文档库功能 - 我在那里使用'DocumentLibrary'。另外,您还可以使用'FileOpenPicker'与'StorageApplicationPermission.FutureAccessList'结合使用户选择源文件一次(在首次使用应用程序期间),并将其存储在应用程序的下一次启动中。通过将文件保存到未来的访问列表中,您可以随时访问它。 –

+0

我已经更新了我的答案,并提供了有关'FutureAccessList'的信息 –