我是一个SAS/Python人,我要回补一个C#程序员。 。 。 .
我需要在将文件读入我公司的软件之前对其进行预处理,以确保它是正确的文件类型。问题是,正确的文件扩展名 (*.prj) 与 GIS 制图中使用的 ESRI 的 SHP 文件共享它。更糟糕的是,我公司开发的软件实际上使用 SHP 文件进行映射。因此,正如您可以想象的那样,有时人们会感到困惑。
因此,当我读入 *.prj 文件时,我需要确保它不是 SHP prj 文件。拒绝 ESRI SHP *.prj 文件的最简单方法是读取文件的开头以确定前几个字节是否为以下之一:
对于我有权访问的文件,#1 似乎是最常见的,但可能还有其他我没有遇到过的。这些似乎称为 WKT 文件,并且可能有其他前导字节(请参阅坐标系此处)。
目前,当加载这些 ESRI SHP 文件时,我的软件会正确抛出异常。然而,问题在于该信息含糊且笼统。我想添加一些代码,如果选择了这些 ESRI SHP 文件之一,则会提醒用户该文件是映射文件,并且他们不应删除或覆盖它。
我已经成功编写了一个控制台应用程序来测试它,它“有效”,但仅适用于主要的 WKT 类型。我希望能够在必要时添加更多搜索词,更重要的是,我喜欢 linq 代码的简单性。
到目前为止,我还没有找到使用相同方法进行多个搜索词的方法。此时这对我来说更像是一次学习练习。
我尝试了几种不同的选项,例如使用列表。但我无法让 linq 能够将它们与
READLINES
语句一起使用。
如有任何帮助,我们将不胜感激。
using System;
using System.Xml;
using System.Linq;
using System.Collections.Generic;
namespace TestPgm
{
public class Check_PRJ
{
// check to see if PRJ file is the correct file
public static void Main()
{
Console.Write("Please enter file name and path:");
string fname = Console.ReadLine();
string prj_flag = "GEOGCS[";
string dir = new FileInfo(fname).DirectoryName.ToString();
if (IsPrjFile(fname, prj_flag) == true)
Console.WriteLine("PRJ file is a component of a GIS SHP file. " +
"It is not a corrupted file--do not delete.");
else
Console.WriteLine("File is an Epi Info PRJ file.");
static bool IsPrjFile(string input, string search)
{
try
{
return File.ReadLines(input).Any(x => x.Contains(search));
}
catch (Exception ex)
{
return false;
Console.WriteLine(ex);
}
}
}
}
}
ESRI SHP prj 文件示例如下:
GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["格林威治",0],UNIT["度",0.017453292519943295]]
尝试使用这个
//instead of string its an IEnumerable of string
static bool IsPrjFile(string input, IEnumerable<string> searchItems)
{
try
{
//check if any entry of "searchItems" does contain in x
return File.ReadLines(input).Any(x => searchItems.Any(y => x.Contains(y)));
}
catch (Exception ex)
{
return false;
Console.WriteLine(ex);
}
}
仅供参考,而不是
string dir = new FileInfo(fname).DirectoryName.ToString();
用这个
string dir = Path.GetDirectoryName(fname);
https://learn.microsoft.com/en-us/dotnet/api/system.io.path.getdirectoryname?view=net-7.0