CSharp2012.03.09 10:56




윈도우 OS에는 파일의 생성,변경,삭제에 대해서 이벤트를 수신자에게 전달하는 기능이 있습니다. 이중에서 C#에서는 FileSystemWatcher 기능으로 파일의 변경을 감지할 수 있습니다.
 
Case 1:
 1. 기존파일 삭제(Delete Event)
 2. 신규파일 생성(Create Event)
 
기존에 있는 파일의 내용을 변경하여 새로운 내용으로 변경할 때 일반적으로는 다음과 같은 절차로 변경합니다.
 그러나 우리가 원하는 이벤트는 Change 이벤트 1개만 발생하기를 원합니다.
 
Case 2:
 

FileStream fs = null;
StreamWriter sw = null;

fs = new FileStream(txtFileName.Text, FileMode.Open, FileAccess.Write, FileShare.None);
sw = new StreamWriter(fs, System.Text.Encoding.Default);
sw.BaseStream.Seek(0, SeekOrigin.Begin);
sw.Write(txtOutput.Text);

sw.Flush();
sw.Close();
fs.Close();

 이 경우는 기존파일 100bytes 의 문서이고 변경 내용이 90bytes 인 경우 10bytes 의 쓰레기가 남습니다.
 
Case 3:
 System.IO.Copy,  System.IO.Move 의 사용은 원하지 않는 추가 Change 이벤트가 발생합니다.
 
Case 4:
 마지막 방법은 Dos 의 내장 명령어인 move를 사용하여 업데이트를 하는 방법입니다.
이 경우에 특별한 조건을 만족하면 우리가 원하는 1개의 Change 이벤트만을 발생시킵니다.
 1) 변경할려고 하는 하는 내용을 포함한 파일을 생성합니다.
 -. 변경대상 파일과 이름을 동일하게 합니다.
 -. 변경대상 파일과 같은 Root 디렉토리에 저장합니다. (C:\, D:\....)
 2) Dos 명령어를 사용해서 이동합니다.
 예)  cmd /c move D:\Test1\Test.xml   D:\Test2\Test.xml


그러면 Case 4의 경우를 C#으로 구현해 보겠습니다. C#에서 Dos 내장 명령어의 실행은 cmd.exe 명령어의 파라미터를 통해서 실행합니다.


string strTempFileName = @"C:\Temp\Test1\Test.xml";
string strTempFileName = Path.Combine(strTempFolder, txtFileName.Text);

FileStream fs = null;
StreamWriter sw = null;
fs = new FileStream(strTempFileName, FileMode.Create, FileAccess.Write, FileShare.None);
sw = new StreamWriter(fs, System.Text.Encoding.Default);
sw.Write(txtOutput.Text);

sw.Flush();
sw.Close();
fs.Close();

try
{
 System.Diagnostics.Process p = new System.Diagnostics.Process();
 p.StartInfo = new System.Diagnostics.ProcessStartInfo();
 p.StartInfo.FileName = "cmd.exe";
 p.StartInfo.Arguments = String.Format(@"/c move {0} {1}", strTempFileName, txtFileName.Text);
 p.StartInfo.CreateNoWindow = true;
 p.StartInfo.ErrorDialog = false;
 p.StartInfo.RedirectStandardInput = true;
 p.StartInfo.UseShellExecute = false;
 p.Start(); 
}
catch (Exception ex)
{
 txtStatus.AppendText(ex.Message + Environment.NewLine);
}
신고




Posted by 금붕어70
Android2011.04.11 17:27





다른 블로그를 보고 간단한 설명만 되어 있어서 어떻게 구현해야 하나 고민하다가 구현해본 소스입니다.
개발에 참고 하세요.

1. chart_demo.xml


	
	


2. ChartDemoActivity.java
public class ChartDemoActivity extends Activity {

	private final static String TAG = ChartDemoActivity.class.getSimpleName();
	private GraphicalView mChartView;
	private XYMultipleSeriesRenderer mRenderer;
	private XYMultipleSeriesDataset mDataset;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.chart_demo);
		mDataset = buildDataset();
		mRenderer = buildRenderer();
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (mChartView == null) {
			LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
			mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
			layout.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
		} else {
			mChartView.repaint();
		}

	}

	private static final long HOUR = 3600 * 1000;
	private static final long DAY = HOUR * 24;
	private static final int HOURS = 24;
	private List x = null;

	private XYMultipleSeriesDataset buildDataset() {
		String[] titles = new String[] { "Inside", "Outside" };
		long now = Math.round(new Date().getTime() / DAY) * DAY;
		x = new ArrayList();
		for (int i = 0; i < titles.length; i++) {
			Date[] dates = new Date[HOURS];
			for (int j = 0; j < HOURS; j++) {
				dates[j] = new Date(now - (HOURS - j) * HOUR);
			}
			x.add(dates);
		}
		List values = new ArrayList();

		values.add(new double[] { 21.2, 21.5, 21.7, 21.5, 21.4, 21.4, 21.3, 21.1, 20.6, 20.3, 20.2, 19.9, 19.7, 19.6,
				19.9, 20.3, 20.6, 20.9, 21.2, 21.6, 21.9, 22.1, 21.7, 21.5 });
		values.add(new double[] { 1.9, 1.2, 0.9, 0.5, 0.1, -0.5, -0.6, MathHelper.NULL_VALUE, MathHelper.NULL_VALUE,
				-1.8, -0.3, 1.4, 3.4, 4.9, 7.0, 6.4, 3.4, 2.0, 1.5, 0.9, -0.5, MathHelper.NULL_VALUE, -1.9, -2.5, -4.3 });

		XYMultipleSeriesDataset dataset = buildDateDataset(titles, x, values);
		return dataset;
	}

	protected XYMultipleSeriesDataset buildDateDataset(String[] titles, List xValues, List yValues) {
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
		int length = titles.length;
		for (int i = 0; i < length; i++) {
			TimeSeries series = new TimeSeries(titles[i]);
			Date[] xV = xValues.get(i);
			double[] yV = yValues.get(i);
			int seriesLength = xV.length;
			for (int k = 0; k < seriesLength; k++) {
				series.add(xV[k], yV[k]);
			}
			dataset.addSeries(series);
		}
		return dataset;
	}

	private XYMultipleSeriesRenderer buildRenderer() {

		int[] colors = new int[] { Color.GREEN, Color.BLUE };
		PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND };
		XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
		int length = renderer.getSeriesRendererCount();
		for (int i = 0; i < length; i++) {
			((XYSeriesRenderer) renderer.getSeriesRendererAt(i)).setFillPoints(true);
		}

		setChartSettings(renderer, "Sensor temperature", "Hour", "Celsius degrees", x.get(0)[0].getTime(),
				x.get(0)[HOURS - 1].getTime(), -5, 30, Color.LTGRAY, Color.LTGRAY);

		renderer.setXLabels(10);
		renderer.setYLabels(10);
		renderer.setShowGrid(true);
		renderer.setXLabelsAlign(Align.CENTER);
		renderer.setYLabelsAlign(Align.RIGHT);
		return renderer;
	}

	protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles) {
		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
		renderer.setAxisTitleTextSize(16);
		renderer.setChartTitleTextSize(20);
		renderer.setLabelsTextSize(15);
		renderer.setLegendTextSize(15);
		renderer.setPointSize(5f);
		renderer.setMargins(new int[] { 20, 30, 15, 0 });
		int length = colors.length;
		for (int i = 0; i < length; i++) {
			XYSeriesRenderer r = new XYSeriesRenderer();
			r.setColor(colors[i]);
			r.setPointStyle(styles[i]);
			renderer.addSeriesRenderer(r);
		}
		return renderer;
	}

	protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle, String yTitle,
			double xMin, double xMax, double yMin, double yMax, int axesColor, int labelsColor) {
		renderer.setChartTitle(title);
		renderer.setXTitle(xTitle);
		renderer.setYTitle(yTitle);
		renderer.setXAxisMin(xMin);
		renderer.setXAxisMax(xMax);
		renderer.setYAxisMin(yMin);
		renderer.setYAxisMax(yMax);
		renderer.setAxesColor(axesColor);
		renderer.setLabelsColor(labelsColor);
	}
}

3. AndroidManifest.xml 에 다음 Activity 정의 추가

	
	
	
	

신고

'Android' 카테고리의 다른 글

[안드로이드]Smart Switch release  (0) 2014.06.09
[안드로이드]Wifi Scanning 에 대한 방법  (0) 2014.06.03
Embedded AChartEngine  (2) 2011.04.11
Pick up the phone  (1) 2011.04.08
Android Custom ListView with CheckBox  (7) 2011.03.03
WiFi Monitor  (0) 2011.02.16




Posted by 금붕어70
Android2011.04.08 14:10





"Pick up the phone.(전화 받으세요)" 만들어서 출시 하였습니다.
아내는 교회를  다녀오거나 도서관에 갈때는 항상 휴대폰을 진동으로 변경하고는 원래 상태로 되돌리는 것을 잊어 버립니다.
급하게 연락해야 할때는 그것때문에 많이 싸우기도하였습니다.
나이가 들어가면서 반복적으로 해야할 일도 점점 더 잊어버리는 경향이 있습니다. 물론 저도 마찬가지지만....

부재중 전화가 지정된 시간 몇 번이상 오면 벨소리 볼륨과 진동을 옵션에서 설정한데로 복구하는 기능을 개발하였습니다.
조금은 복잡해 보이는데 그래도 한번 설정하면 잊어 먹고 편하게 살수 있어서 좋을 것 같습니다.
문자 메세지로도 핸드폰을 조정할 수 있습니다.
벨소리, 진동, 무선인터넷 켜기/끄기 와 휴대폰이 탑재된 센스 정보를 이용하여 필요하면 받아 올수 있습니다.
이 정보로 휴대폰을 가진 사람이 이동중인지 휴대폰과 떨어져 있는지를 대충 알 수 있습니다.
* Free 버젼과 Donate 버젼 2가지가 있습니다.  
https://market.android.com/details?id=com.nalsil.DroidControl&feature=search_result






신고

'Android' 카테고리의 다른 글

[안드로이드]Wifi Scanning 에 대한 방법  (0) 2014.06.03
Embedded AChartEngine  (2) 2011.04.11
Pick up the phone  (1) 2011.04.08
Android Custom ListView with CheckBox  (7) 2011.03.03
WiFi Monitor  (0) 2011.02.16
Android ImageView ZoomIn/ZoomOut, Move  (0) 2010.05.11




Posted by 금붕어70

티스토리 툴바