2011-08-08 62 views
1

因此,我正在研究一个C#程序,该程序在目录中接收一组分隔文本文件并解析文件中的信息(即文件路径,文件名,关联的关键字)。这是一个什么样的文件看起来像......如何访问另一个类中的一个类的变量? [C#]

C:\Documents and Settings\workspace\Extracted Items\image2.jpeg;image0;keyword1, keyword2, keyword3, keyword4 
C:\Documents and Settings\workspace\Extracted Items\image3.jpeg;image1;keyword1, keyword2, keyword3, keyword4 
C:\Documents and Settings\workspace\Extracted Items\image4.jpeg;image2;keyword1, keyword2, keyword3, keyword4 
C:\Documents and Settings\workspace\Extracted Items\image5.jpeg;image3;keyword1, keyword2, keyword3, keyword4 

嗯,我给我的合作伙伴,这是否一些代码,但我需要能够访问列表中的变量,那就是一个内填充方法。这是代码:

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApp 
{ 
    public class FileIO 
    { 
     private static Boolean isTextFile; 
     private static Boolean debug; 

     private static int semiColonLoc1, semiColonLoc2, dblQuoteLoc1; 
     private static int lineLength, currentTagLength; 
     private static int numImages; 
     private static int numFiles; 
     public static List<Image> lImageSet; 

     /* 
      **************************************************** 
      ***** CHANGE THIS PATH TO YOUR PROPERTIES FILE ***** 
      **************************************************** 
     */ 
     private static readonly string propertiesFileDir = "C:/Documents and Settings/properties.properties"; 

     public PropertyKeys getProperties(string propertiesFileDir, PropertyKeys aPropertyKeys) 
     { 
      string line; 
      string directoryKey = "extractedInfoDirectory"; 
      string debugKey = "debug2"; 
      string directory; 

      Boolean isDirectoryKey; 
      Boolean isDebugKey; 

      System.IO.StreamReader file = new System.IO.StreamReader(propertiesFileDir); 

      while ((line = file.ReadLine()) != null) 
      { 

       isDirectoryKey = false; 
       isDebugKey = false; 

       // If the current line is a certain length, checks the current line's key 
       if (line.Length > debugKey.Length) 
       { 
        isDebugKey = line.Substring(0, debugKey.Length).Equals(debugKey, StringComparison.Ordinal); 

        if (line.Length > directoryKey.Length) 
        { 
         isDirectoryKey = line.Substring(0, directoryKey.Length).Equals(directoryKey, StringComparison.Ordinal); 
        } 
       } 

       // Checks if the current line's key is the extractedInfoDirectory 
       if (isDirectoryKey) 
       { 
        directory = line.Substring(directoryKey.Length + 1); 
        aPropertyKeys.setExtractedInfoDir(directory); 
       } 

       // Checks if the current line's key is the debug2 
       else if (isDebugKey) 
       { 
        debug = Convert.ToBoolean(line.Substring(debugKey.Length + 1)); 
        aPropertyKeys.setDebug(debug); 
       } 
      } 

      return aPropertyKeys; 
     } 

     public void loadFile() 
     { 

      string line; 
      string tempLine; 
      string fileToRead; 
      string fileRename; 
      string imagePath, imageName, imageTags, currentTag; 
      string extractedInfoDir; 
      string extension; 
      string textfile = "txt"; 
      string[] filePaths; 

      PropertyKeys aPropertyKeys = new PropertyKeys(); 

      // Finds extractedInfoDir and debug values 
      aPropertyKeys = getProperties(propertiesFileDir, aPropertyKeys); 
      extractedInfoDir = aPropertyKeys.getExtractedInfoDir(); 
      debug = aPropertyKeys.getDebug(); 

      // Finds all files in the extracted info directory 
      filePaths = Directory.GetFiles(extractedInfoDir); 
      numFiles = filePaths.Length; 

      // For each file in the directory... 
      for (int n = 0; n < numFiles; n++) 
      { 
       int k = filePaths[n].Length; 

       // Finds extension for the current file 
       extension = filePaths[n].Substring(k - 3); 

       // Checks if the current file is .txt 
       isTextFile = extension.Equals(textfile, StringComparison.Ordinal); 

       // Only reads file if it is .txt 
       if (isTextFile == true) 
       { 

        fileToRead = filePaths[n]; 
        Console.WriteLine(fileToRead); 
        System.IO.StreamReader file = new System.IO.StreamReader(fileToRead); 

        // Reset variables and create a new lImageSet object 
        lImageSet = new List<Image>(); 

        line = ""; tempLine = ""; imagePath = ""; imageName = ""; imageTags = ""; currentTag = ""; 
        semiColonLoc1 = 0; semiColonLoc2 = 0; dblQuoteLoc1 = 0; lineLength = 0; currentTagLength = 0; numImages = 0; 

        while ((line = file.ReadLine()) != null) 
        { 

         // Creates a new Image object 
         Image image = new Image(); 
         numImages++; 

         lineLength = line.Length; 

         // Finds the image path (first semicolon delimited field) 
         semiColonLoc1 = line.IndexOf(";"); 
         imagePath = line.Substring(0, semiColonLoc1); 
         image.setPath(imagePath); 

         tempLine = line.Substring(semiColonLoc1 + 1); 

         // Finds the image name (second semicolon delimited field) 
         semiColonLoc2 = tempLine.IndexOf(";"); 
         imageName = tempLine.Substring(0, semiColonLoc2); 
         image.setName(imageName); 

         tempLine = tempLine.Substring(semiColonLoc2 + 1); 

         // Finds the image tags (third semicolon delimited field) 
         imageTags = tempLine; 

         dblQuoteLoc1 = 0; 

         // Continues to gather tags until there are none left 
         while (dblQuoteLoc1 != -1) 
         { 
          dblQuoteLoc1 = imageTags.IndexOf("\""); 
          imageTags = imageTags.Substring(dblQuoteLoc1 + 1); 
          dblQuoteLoc1 = imageTags.IndexOf("\""); 

          if (dblQuoteLoc1 != -1) 
          { 
           // Finds the next image tag (double quote deliminated) 
           currentTag = imageTags.Substring(0, dblQuoteLoc1); 
           currentTagLength = currentTag.Length; 

           // Adds the tag to the current image 
           image.addTag(currentTag); 
           image.iNumTags++; 
           imageTags = imageTags.Substring(dblQuoteLoc1 + 1); 
          } 
         } 

         // Adds the image to the current image set 
         lImageSet.Add(image); 

        } 

        // Prints out information about what information has been stored 
        if (debug == true) 
        { 
         Console.WriteLine("Finished file " + (n + 1) + ": " + filePaths[n]); 

         for (int i = 0; i < numImages; i++) 
         { 
          Console.WriteLine(); 
          Console.WriteLine("***Image " + (i + 1) + "***"); 
          Console.WriteLine("Name: " + lImageSet.ElementAt(i).getName()); 
          Console.WriteLine("Path: " + lImageSet.ElementAt(i).getPath()); 
          Console.WriteLine("Tags: "); 

          for (int j = 0; j < lImageSet.ElementAt(i).iNumTags; j++) 
          { 
           Console.WriteLine(lImageSet.ElementAt(i).lTags.ElementAt(j)); 
          } 

         } 
        } 

        file.Close(); 

        // Changes destination file extension to .tmp 
        fileRename = fileToRead.Substring(0, fileToRead.Length - 4); 
        fileRename += ".tmp"; 

        // Changes file extension to .tmp 
        System.IO.File.Move(fileToRead, fileRename); 
       } 

       // Not a text file 
       else 
       { 
        Console.WriteLine("Skipping file (no .txt extension)"); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

但是,我不想惹他的代码太多,因为他暂时不在这里解决任何问题。所以我只想知道如何在他的代码中访问另一个类中的lImageSet。我希望它会像使用FileIO fo = new FileIO实例化FileIO,然后做类似fo.loadFile().lImageSet的事情,但情况并非如此。有任何想法吗?

+0

为什么所有成员都是静态的?如果你有这个类的多个实例...? –

回答

1

这是公共 - 所以从你的类,你可以访问它:

FileIO.lImageSet 

要得到它的价值,只是遍历它:

//from FishBasketGordo's answer - load up the fo object 
FileIO fo = new FileIO(); 
fo.loadFile(); 

foreach(var img in FileIO.lImageSet) { 
    //do something with each img item in lImageSet here... 
} 

编辑:我建立在FishBasketGordo的回答中,将他的loadFile()调用加入我的示例中。

+0

所以在foreach循环中,如果你注意到OP在向底部发布的代码中有如何使用'Console.WriteLine(“Name:”+ lImageSet.ElementAt(i).getName());',我无法访问“ElementAt”方法,那么我如何到达列表中我想要的位置? –

+0

Nvm,我弄明白了。谢谢你和其他人的帮助!自从你加倍努力之后,我会给你答案,并在那里添加这个foreach。 :) –

+0

谢谢 - 很高兴我能帮上忙。 –

3

由于lImageSet是静态的,所有你需要做的访问,它是:

List<image> theList = FileIO.lImageSet;

没有实例化的对象是需要得到该领域的参考。

2

该列表是静态的,所以你用的名称,该类访问:

List<Image> theList = FileIO.lImageSet 
2

loadFile方法返回void,所以你不能用点运算符来从中获取任何东西。你会想要做这样的事情:

FileIO fo = new FileIO(); 
fo.loadFile(); 
List<Image> theImages = FileIO.lImageSet; 
+0

+1提醒我,我没有加载FileIO obj。 –

1

因为lImageSetstatic,这样你就不会需要实例FileIO专注得到它。

尝试FileIO.lImageSet

相关问题