I measure the Time of a wav File and got it back in a TimeSpan.
When I look into the Timespan the totalSeconds value is the exact time i need!
For example: TotalSeconds = 6.6999999999999993
When I write it into a File, it will be roundet to 6.7!
I need the exact value in the textfile!
Here is the code:
TimeSpan duration = GetWavFileDuration(wav);
string[] wavStrings = wav.Split('\\');
using (TextWriter writer = new StreamWriter(wav.Replace(".wav", ".plist"), false, Encoding.UTF8))
{
writer.NewLine = "\n";
writer.Write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" +
"<plist version=\"1.0\">\n" +
"<dict>\n" +
"\t<key>bundle_id</key>\n" +
"\t<string>" + folderStrings[folderStrings.Length - 1] + "</string>\n" +
"\t<key>channels</key>\n" +
"\t<integer>2</integer>\n" +
"\t<key>duration</key>\n" +
"\t<real>" + duration.TotalSeconds.ToString().Replace(',', '.') + "</real>\n" +
"\t<key>filetitle</key>\n" +
"\t<string>" + wavStrings[wavStrings.Length - 1] + "</string>\n" +
"\t<key>sender</key>\n" +
"\t<string>" + folderStrings[folderStrings.Length - 1] + "</string>\n" +
"</dict>\n" +
"</plist>");
}
You can simply write the value of TotalSeconds to a file, e.g.:
TimeSpan ts = new TimeSpan(1234);
File.WriteAllText(#"C:\Temp\TimeTest.txt", ts.TotalSeconds.ToString());
// File contains: 0.0001234
You can pass the parameters to the ToString method:
ts.TotalSecondsToString("0.00"); //2dp Number
ts.TotalSecondsToString("n2"); // 2dp Number
ts.TotalSecondsToString("c2"); // 2dp currency
The first two options are for your issue.
Related
I have an xml configuration file:
<Instruments>
<Instrument Name="uEyeFF1" Assembly="Instruments" Class="IDSuEye1240SE">
<Settings>
<IDSuEye1240SESettings>
<Serial>4102801225</Serial>
<µmPerPixel>5.3</µmPerPixel>
<Color>true</Color>
</IDSuEye1240SESettings>
</Settings>
</Instrument>
<!-- more Instruments -->
</Instruments>
and a class to which the <IDSuEye1240SESettings> node is deserialized:
[Serializable]
public class IDSuEye1240SESettings
{
[XmlElement]
public string Serial { get; set; }
[XmlElement]
public double µmPerPixel { get; set; }
[XmlElement]
public bool Color { get; set; }
}
But when deserializing, I get the following error:
'There is an error in XML document (69, 10).' in Utilities.Load() as System.Void
at path hidden 'Name cannot begin with the 'µ' character, hexadecimal value 0xB5. Line 69, position 10.' in System.Xml.Throw() as System.Void
rest of stack trace...
On a different PC, an earlier compiled version of the same application is running, and I am seemingly able to deserialize the xml to the class. But the developer who wrote it is not around.
As far as I know, the working code doing the deserialization should be the same as the current code:
// the <Settings> node's children is value below
_settings = ConvertNode<IDSuEye1240SESettings>(((XmlNode[])value).First())
public T ConvertNode<T>(XmlNode node)
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.Write(node.OuterXml);
sw.Flush();
ms.Position = 0;
XmlSerializer ser = new XmlSerializer(typeof(T));
T result = (T)ser.Deserialize(ms);
return result;
}
Is it possible that there is something different in the compiled code which works to allow the 'µ' character to start an xml element name?
I had found a difference in the first line of the xml files between the PC's:
Working:
<?xml version="1.0"?>
<Instruments
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.w3schools.com Instruments.xsd">
Not working:
<?xml version="1.0" encoding="utf-8"?>
<Instruments
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.w3schools.com Instruments.xsd">
But I removed the encoding attribute but that only removed the red underline below the 'µ' for the new file open in the IDE. It didn't solve the serialization issue.
The schema files are identical for both PCs, if that matters.
Is it possible to allow the illegal character to start an xml node?
I decompiled System.Xml to find out why this exception might occur and I think I found an answer...
In short
There is no way to crack into it. But it is possible to solve your problem without changing XML.
In long
Unfotunetly XML fifth edition is considerably differs in deifinition of characters which can be used to start tag names. Here is decompiled constants from System.Xml which proves my words:
#if XML10_FIFTH_EDITION
// StartNameChar without ':' -- see Section 2.3 production [4]
const string s_NCStartName =
"\u0041\u005a\u005f\u005f\u0061\u007a\u00c0\u00d6" +
"\u00d8\u00f6\u00f8\u02ff\u0370\u037d\u037f\u1fff" +
"\u200c\u200d\u2070\u218f\u2c00\u2fef\u3001\ud7ff" +
"\uf900\ufdcf\ufdf0\ufffd";
// NameChar without ':' -- see Section 2.3 production [4a]
const string s_NCName =
"\u002d\u002e\u0030\u0039\u0041\u005a\u005f\u005f" +
"\u0061\u007a\u00b7\u00b7\u00c0\u00d6\u00d8\u00f6" +
"\u00f8\u037d\u037f\u1fff\u200c\u200d\u203f\u2040" +
"\u2070\u218f\u2c00\u2fef\u3001\ud7ff\uf900\ufdcf" +
"\ufdf0\ufffd";
#else
const string s_NCStartName =
"\u0041\u005a\u005f\u005f\u0061\u007a" +
"\u00c0\u00d6\u00d8\u00f6\u00f8\u0131\u0134\u013e" +
"\u0141\u0148\u014a\u017e\u0180\u01c3\u01cd\u01f0" +
"\u01f4\u01f5\u01fa\u0217\u0250\u02a8\u02bb\u02c1" +
"\u0386\u0386\u0388\u038a\u038c\u038c\u038e\u03a1" +
"\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc" +
"\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c" +
"\u040e\u044f\u0451\u045c\u045e\u0481\u0490\u04c4" +
"\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb\u04ee\u04f5" +
"\u04f8\u04f9\u0531\u0556\u0559\u0559\u0561\u0586" +
"\u05d0\u05ea\u05f0\u05f2\u0621\u063a\u0641\u064a" +
"\u0671\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3" +
"\u06d5\u06d5\u06e5\u06e6\u0905\u0939\u093d\u093d" +
"\u0958\u0961\u0985\u098c\u098f\u0990\u0993\u09a8" +
"\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09dc\u09dd" +
"\u09df\u09e1\u09f0\u09f1\u0a05\u0a0a\u0a0f\u0a10" +
"\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36" +
"\u0a38\u0a39\u0a59\u0a5c\u0a5e\u0a5e\u0a72\u0a74" +
"\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8" +
"\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd" +
"\u0ae0\u0ae0\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28" +
"\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3d\u0b3d" +
"\u0b5c\u0b5d\u0b5f\u0b61\u0b85\u0b8a\u0b8e\u0b90" +
"\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f" +
"\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5\u0bb7\u0bb9" +
"\u0c05\u0c0c\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33" +
"\u0c35\u0c39\u0c60\u0c61\u0c85\u0c8c\u0c8e\u0c90" +
"\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9\u0cde\u0cde" +
"\u0ce0\u0ce1\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28" +
"\u0d2a\u0d39\u0d60\u0d61\u0e01\u0e2e\u0e30\u0e30" +
"\u0e32\u0e33\u0e40\u0e45\u0e81\u0e82\u0e84\u0e84" +
"\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97" +
"\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7" +
"\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb0\u0eb2\u0eb3" +
"\u0ebd\u0ebd\u0ec0\u0ec4\u0f40\u0f47\u0f49\u0f69" +
"\u10a0\u10c5\u10d0\u10f6\u1100\u1100\u1102\u1103" +
"\u1105\u1107\u1109\u1109\u110b\u110c\u110e\u1112" +
"\u113c\u113c\u113e\u113e\u1140\u1140\u114c\u114c" +
"\u114e\u114e\u1150\u1150\u1154\u1155\u1159\u1159" +
"\u115f\u1161\u1163\u1163\u1165\u1165\u1167\u1167" +
"\u1169\u1169\u116d\u116e\u1172\u1173\u1175\u1175" +
"\u119e\u119e\u11a8\u11a8\u11ab\u11ab\u11ae\u11af" +
"\u11b7\u11b8\u11ba\u11ba\u11bc\u11c2\u11eb\u11eb" +
"\u11f0\u11f0\u11f9\u11f9\u1e00\u1e9b\u1ea0\u1ef9" +
"\u1f00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d" +
"\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d" +
"\u1f5f\u1f7d\u1f80\u1fb4\u1fb6\u1fbc\u1fbe\u1fbe" +
"\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb" +
"\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u2126\u2126" +
"\u212a\u212b\u212e\u212e\u2180\u2182\u3007\u3007" +
"\u3021\u3029\u3041\u3094\u30a1\u30fa\u3105\u312c" +
"\u4e00\u9fa5\uac00\ud7a3";
const string s_NCName =
"\u002d\u002e\u0030\u0039\u0041\u005a\u005f\u005f" +
"\u0061\u007a\u00b7\u00b7\u00c0\u00d6\u00d8\u00f6" +
"\u00f8\u0131\u0134\u013e\u0141\u0148\u014a\u017e" +
"\u0180\u01c3\u01cd\u01f0\u01f4\u01f5\u01fa\u0217" +
"\u0250\u02a8\u02bb\u02c1\u02d0\u02d1\u0300\u0345" +
"\u0360\u0361\u0386\u038a\u038c\u038c\u038e\u03a1" +
"\u03a3\u03ce\u03d0\u03d6\u03da\u03da\u03dc\u03dc" +
"\u03de\u03de\u03e0\u03e0\u03e2\u03f3\u0401\u040c" +
"\u040e\u044f\u0451\u045c\u045e\u0481\u0483\u0486" +
"\u0490\u04c4\u04c7\u04c8\u04cb\u04cc\u04d0\u04eb" +
"\u04ee\u04f5\u04f8\u04f9\u0531\u0556\u0559\u0559" +
"\u0561\u0586\u0591\u05a1\u05a3\u05b9\u05bb\u05bd" +
"\u05bf\u05bf\u05c1\u05c2\u05c4\u05c4\u05d0\u05ea" +
"\u05f0\u05f2\u0621\u063a\u0640\u0652\u0660\u0669" +
"\u0670\u06b7\u06ba\u06be\u06c0\u06ce\u06d0\u06d3" +
"\u06d5\u06e8\u06ea\u06ed\u06f0\u06f9\u0901\u0903" +
"\u0905\u0939\u093c\u094d\u0951\u0954\u0958\u0963" +
"\u0966\u096f\u0981\u0983\u0985\u098c\u098f\u0990" +
"\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9" +
"\u09bc\u09bc\u09be\u09c4\u09c7\u09c8\u09cb\u09cd" +
"\u09d7\u09d7\u09dc\u09dd\u09df\u09e3\u09e6\u09f1" +
"\u0a02\u0a02\u0a05\u0a0a\u0a0f\u0a10\u0a13\u0a28" +
"\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39" +
"\u0a3c\u0a3c\u0a3e\u0a42\u0a47\u0a48\u0a4b\u0a4d" +
"\u0a59\u0a5c\u0a5e\u0a5e\u0a66\u0a74\u0a81\u0a83" +
"\u0a85\u0a8b\u0a8d\u0a8d\u0a8f\u0a91\u0a93\u0aa8" +
"\u0aaa\u0ab0\u0ab2\u0ab3\u0ab5\u0ab9\u0abc\u0ac5" +
"\u0ac7\u0ac9\u0acb\u0acd\u0ae0\u0ae0\u0ae6\u0aef" +
"\u0b01\u0b03\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28" +
"\u0b2a\u0b30\u0b32\u0b33\u0b36\u0b39\u0b3c\u0b43" +
"\u0b47\u0b48\u0b4b\u0b4d\u0b56\u0b57\u0b5c\u0b5d" +
"\u0b5f\u0b61\u0b66\u0b6f\u0b82\u0b83\u0b85\u0b8a" +
"\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c" +
"\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb5" +
"\u0bb7\u0bb9\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd" +
"\u0bd7\u0bd7\u0be7\u0bef\u0c01\u0c03\u0c05\u0c0c" +
"\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c33\u0c35\u0c39" +
"\u0c3e\u0c44\u0c46\u0c48\u0c4a\u0c4d\u0c55\u0c56" +
"\u0c60\u0c61\u0c66\u0c6f\u0c82\u0c83\u0c85\u0c8c" +
"\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3\u0cb5\u0cb9" +
"\u0cbe\u0cc4\u0cc6\u0cc8\u0cca\u0ccd\u0cd5\u0cd6" +
"\u0cde\u0cde\u0ce0\u0ce1\u0ce6\u0cef\u0d02\u0d03" +
"\u0d05\u0d0c\u0d0e\u0d10\u0d12\u0d28\u0d2a\u0d39" +
"\u0d3e\u0d43\u0d46\u0d48\u0d4a\u0d4d\u0d57\u0d57" +
"\u0d60\u0d61\u0d66\u0d6f\u0e01\u0e2e\u0e30\u0e3a" +
"\u0e40\u0e4e\u0e50\u0e59\u0e81\u0e82\u0e84\u0e84" +
"\u0e87\u0e88\u0e8a\u0e8a\u0e8d\u0e8d\u0e94\u0e97" +
"\u0e99\u0e9f\u0ea1\u0ea3\u0ea5\u0ea5\u0ea7\u0ea7" +
"\u0eaa\u0eab\u0ead\u0eae\u0eb0\u0eb9\u0ebb\u0ebd" +
"\u0ec0\u0ec4\u0ec6\u0ec6\u0ec8\u0ecd\u0ed0\u0ed9" +
"\u0f18\u0f19\u0f20\u0f29\u0f35\u0f35\u0f37\u0f37" +
"\u0f39\u0f39\u0f3e\u0f47\u0f49\u0f69\u0f71\u0f84" +
"\u0f86\u0f8b\u0f90\u0f95\u0f97\u0f97\u0f99\u0fad" +
"\u0fb1\u0fb7\u0fb9\u0fb9\u10a0\u10c5\u10d0\u10f6" +
"\u1100\u1100\u1102\u1103\u1105\u1107\u1109\u1109" +
"\u110b\u110c\u110e\u1112\u113c\u113c\u113e\u113e" +
"\u1140\u1140\u114c\u114c\u114e\u114e\u1150\u1150" +
"\u1154\u1155\u1159\u1159\u115f\u1161\u1163\u1163" +
"\u1165\u1165\u1167\u1167\u1169\u1169\u116d\u116e" +
"\u1172\u1173\u1175\u1175\u119e\u119e\u11a8\u11a8" +
"\u11ab\u11ab\u11ae\u11af\u11b7\u11b8\u11ba\u11ba" +
"\u11bc\u11c2\u11eb\u11eb\u11f0\u11f0\u11f9\u11f9" +
"\u1e00\u1e9b\u1ea0\u1ef9\u1f00\u1f15\u1f18\u1f1d" +
"\u1f20\u1f45\u1f48\u1f4d\u1f50\u1f57\u1f59\u1f59" +
"\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4" +
"\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc" +
"\u1fd0\u1fd3\u1fd6\u1fdb\u1fe0\u1fec\u1ff2\u1ff4" +
"\u1ff6\u1ffc\u20d0\u20dc\u20e1\u20e1\u2126\u2126" +
"\u212a\u212b\u212e\u212e\u2180\u2182\u3005\u3005" +
"\u3007\u3007\u3021\u302f\u3031\u3035\u3041\u3094" +
"\u3099\u309a\u309d\u309e\u30a1\u30fa\u30fc\u30fe" +
"\u3105\u312c\u4e00\u9fa5\uac00\ud7a3";
#endif
As to why your problem occurs: s_NCStartName constant defines which characters can be used to start your name, and in fifth edition it is VERY short (you will not find 0xB5 part in new edition string), and there is no way around it. It is constant, hardcoded into System.Xml. Well, it is Microsoft, they don't care about backward compatability.
As to solution
You have four options:
Attach old System.Xml, which is in my opinion is worse solution, but easiest.
Preprosses your xml: clean it from invalid start name characters.
Blame Microsoft on task tracker about this: lose of backward compatability.
Use other serialization frameworks, for example Xml.Net
PS
Small advise. You can rewrite ConvertNode like this:
public static T ConvertNode<T>(XmlNode node)
{
using (var reader = new XmlNodeReader(node))
{
var ser = new XmlSerializer(typeof(T));
return (T) ser.Deserialize(reader);
}
}
I have a string variable with it's value formatted to look like "1:23:45 AM"
I need to convert that into a DateTime variable for time without a date component.
I am receiving an "Unhandled exception" error that is being caused by the formatting. If I remove the "AM", it works fine but the "AM/PM" component is needed for what I am trying to do.
I am currently using the following code to attempt this...
"temp" is the name of the variable I am using until I come up with a more meaningful variable name...
public string PlusMinus12(string hour, string minute, string second, string ampm)
{
string PlusMinus;
int rndmTmp1 = Random1();
int rndmTmp2 = Random2();
if (rndmTmp1 == 0)
{
PlusMinus = hour + ":" + minute + ":" + second + ": " + ampm;
return PlusMinus;
}
else if (rndmTmp1 == 1)
{
string temp = hour + ":" + minute + ":" + second +": " + ampm;
**DateTime subtract = DateTime.Parse(temp);**
subtract.AddSeconds(-rndmTmp2);
PlusMinus = subtract.ToString("h:mm:ss tt");
return PlusMinus;
}
else
{
DateTime subtract = DateTime.Parse(temp); is the line causing the error
The error is:
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: String was not recognized as a valid DateTime.
Most of the information I have found so far on this topic include solutions that depend on the existence of the Date component, which I am not using.
Any ideas?
Thank you
You should try parsing it using DateTime.ParseExact using a custom format from here: Custom Date and Time Format Strings
Your problem is this
PlusMinus = hour + ":" + minute + ":" + second + ": " + ampm;
Change it to
PlusMinus = Int32.Parse(hour).ToString("00") + ":" + Int32.Parse(minute).ToString("00") + ":" + second.ToString("00") + " " + ampm;
A little convoluted since strings are passed in as input. No colon after the seconds and zero pad the numbers. Also, since they are input variables, at some point you should verify that they are between 0-59.
If you're only interested in returning the time part, add a extra variable that holds the date part and append it to the front of temp when you parse it?
like:
string tempDate = "2008-05-01 "
This works for me:
string timeString = "1:23:45 AM";
string format = "h:mm:ss tt";
CultureInfo provider = CultureInfo.InvariantCulture;
try
{
DateTime result = DateTime.ParseExact(timeString, format, provider);
Console.WriteLine("{0} converts to {1}.", timeString, result.ToString());
}
catch (FormatException)
{
Console.WriteLine("{0} is not in the correct format.", timeString);
}
Probably your issue is with a particular time.
UPDATE: You need to check you are passing minutes and seconds to this function with a 0 for values like 1-2..9. Because standard provider will not accept a string like '1:1:2 AM'.
public string PlusMinus12(string hour, string minute, string second, string ampm)
{
string PlusMinus;
int rndmTmp1 = Random1();
int rndmTmp2 = Random2();
if (rndmTmp1 == 0)
{
PlusMinus = hour + ":" + minute + ":" + second + ": " + ampm;
return PlusMinus;
}
else if (rndmTmp1 == 1)
{
string temp = hour + ":" + minute + ":" + second +": " + ampm;
DateTime subtract = DateTime.Parse("2000-01-01 " + temp);
subtract.AddSeconds(-rndmTmp2);
PlusMinus = subtract.ToString("h:mm:ss tt");
return PlusMinus;
}
else
{
When trying to create an iCal file I get a very strange issue that I cannot trace. The following is the code used and an example of an event that is set to start at 08:00 and end at 11:00. The file creates with relevant information, but when tryting to add it to Outlook an hour has been added to the end time.
DateTime eventDate = DateTime.Parse("19/06/2014");
DateTime startTime = DateTime.Parse("09:00:00");
DateTime endTime = DateTime.Parse("11:00:00");
string location = "Test Location";
string title = "Test Title";
context.Response.ContentType = "text/x-vcalendar";
string filename = String.Format("attachment; filename={0}.ics", eventname.Replace(" ", "-"));
context.Response.AddHeader("Content-disposition", filename);
context.Response.Write("BEGIN:VCALENDAR" + Environment.NewLine);
context.Response.Write("VERSION:2.0" + Environment.NewLine);
context.Response.Write("METHOD:PUBLISH" + Environment.NewLine);
context.Response.Write("BEGIN:VTIMEZONE" + Environment.NewLine);
context.Response.Write("TZID:Europe/London" + Environment.NewLine);
context.Response.Write("X-LIC-LOCATION:Europe/London" + Environment.NewLine);
context.Response.Write("BEGIN:DAYLIGHT" + Environment.NewLine);
context.Response.Write("TZOFFSETFROM:+0000" + Environment.NewLine);
context.Response.Write("TZOFFSETTO:+0100" + Environment.NewLine);
context.Response.Write("TZNAME:BST" + Environment.NewLine);
context.Response.Write("DTSTART:19700329T010000" + Environment.NewLine);
context.Response.Write("RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU" + Environment.NewLine);
context.Response.Write("END:DAYLIGHT" + Environment.NewLine);
context.Response.Write("BEGIN:STANDARD" + Environment.NewLine);
context.Response.Write("TZOFFSETFROM:+0100" + Environment.NewLine);
context.Response.Write("TZOFFSETTO:+0000" + Environment.NewLine);
context.Response.Write("TZNAME:GMT" + Environment.NewLine);
context.Response.Write("DTSTART:19701025T020000" + Environment.NewLine);
context.Response.Write("RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU" + Environment.NewLine);
context.Response.Write("END:STANDARD" + Environment.NewLine);
context.Response.Write("END:VTIMEZONE" + Environment.NewLine);
context.Response.Write("BEGIN:VEVENT" + Environment.NewLine);
context.Response.Write("ORGANIZER:MAILTO: test#domain.com" + Environment.NewLine);
context.Response.Write("UID: test2#domain.com" + Environment.NewLine);
context.Response.Write("DTSTART:" + startDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
context.Response.Write("DTEND:" + GetMeetingEndDate(startDate, endDate).ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
context.Response.Write("DTSTAMP:" + DateTime.Now.ToUniversalTime().ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
context.Response.Write("SUMMARY:" + subject + Environment.NewLine);
context.Response.Write("DESCRIPTION:" + description + Environment.NewLine);
context.Response.Write("LAST-MODIFIED:" + DateTime.Now.ToUniversalTime().ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
context.Response.Write("PRIORITY:5" + Environment.NewLine);
context.Response.Write("LOCATION;ENCODING=QUOTED-PRINTABLE:" + location + Environment.NewLine);
context.Response.Write("CLASS:PUBLIC" + Environment.NewLine);
context.Response.Write("END:VEVENT" + Environment.NewLine);
context.Response.Write("END:VCALENDAR");
The outcome of this is for the appointment to be added to Outlook with a start time of 09:00 and an end time of 12:00. The end time has increased by one hour.
Please note that the code about is intended for British/GMT use.
I have debugged this procedure and checked all the dates as they are being set and everything is correct. Is there anything that I am missing with this? I really don't want to have to force a reduction in the end hour just so it adds properly to Outlook.
Edit:
The following is the GetMeetingEndDate function.
DateTime GetMeetingEndDate(DateTime startDate, DateTime endDate)
{
DateTime newDate = new DateTime();
if (endDate < startDate)
{
newDate = endDate.AddHours(12);
}
else if (endDate == startDate)
{
newDate = startDate.AddDays(1).AddHours(-1);
}
else
{
newDate = endDate;
}
return newDate;
}
Thank you.
In the below code:-
context.Response.Write("DTSTART:" + startDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
context.Response.Write("DTEND:" + GetMeetingEndDate(startDate, endDate).ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
the DTSTART is set to value startDate.ToUniversalTime() whereas in function GetMeetingEndDate the dates are passed without converting into UTC. Because of this startdate is always correct but iCal is treating your local enddate as UTC date. That might be causing the problem of adding extra hour. The solution is to change the below code block as
context.Response.Write("DTEND:" + GetMeetingEndDate(startDate.ToUniversalTime(), endDate.ToUniversalTime()).ToString("yyyyMMddTHHmmssZ") + Environment.NewLine);
I have so many clases, but I want to catch the sent and the recived information via XML ... The thing is that I don't want to create a Serializer every time i catch an XML doc, so I want to ask you if anyone know how to pack a class type into a TypeOf()
Im trying to create a function that Works something like this:
public void createXML(string fileName, string route)
{
System.Xml.Serialization.XmlSerializer serializador = new System.Xml.Serialization.XmlSerializer(typeof(THIS IS WHAT I WANNA CHANGE TO A VARIABLE PARAMETER));
System.IO.FileStream stream = new System.IO.FileStream(#""+ route + fileName + ".xml", System.IO.FileMode.Create);
}
So what I want to do is to call this function and créate an XML whenever I want, but the thing is that inside the TypeOf() command, I can't figure out a way to put different classes there.
Use generics for this task.
public void createXML<T>(string fileName, string route)
{
System.Xml.Serialization.XmlSerializer serializador = new System.Xml.Serialization.XmlSerializer(typeof(T));
System.IO.FileStream stream = new System.IO.FileStream(#""+ route + fileName + ".xml", System.IO.FileMode.Create);
}
Ok, so i got this so far and if i put the route manually it Works, if i put a custom route is brings an error message saying something about the provided route formant isnt admited, this is my code ... I get the directory, créate it if its not there, then i créate the name of the file, but when i try to créate the XML it just pops the error:
public string[] createDir(string flow, int enclosure, string transaction, string method)
{
DateTime Hoy = DateTime.Now;
libs.Catalogos objCatalogos = new libs.Catalogos();
string day, month, year, hora, min, seg, time, ruta, fileName, name;
string[] datos = new string[2];
int existe;
name = objCatalogos.convertRecinto(enclosure);
day = System.DateTime.Now.ToString("dd");
//day = "13";
month = System.DateTime.Now.ToString("MM");
year = System.DateTime.Now.ToString("yyyy");
hora = System.DateTime.Now.ToString("HH");
min = System.DateTime.Now.ToString("mm");
seg = System.DateTime.Now.ToString("ss");
time = hora + "_" + min + "_" + seg;
ruta = #"C:\inetpub\wwwroot\WsDesarrollo2\" + #"XML" + #"\Empresa_" + name + #"\Flujo_" + flow + #"\Año_" + year + #"\Mes_" + month + #"\Dia_" + day + #"\";
existe = verifyDir(ruta);
if (existe == 0)
{
Directory.CreateDirectory(ruta);
}
fileName = "" + ruta + transaction + "_" + method + "_" + time;
datos[0] = ruta;
datos[1] = fileName;
return datos;
}
public void createXML<T>(string fileName, string route, T objeto)
{
System.Xml.Serialization.XmlSerializer serializador = new System.Xml.Serialization.XmlSerializer(typeof(T));
TextWriter tw = new StreamWriter(#"" + route + #"\" + fileName + ".xml");
serializador.Serialize(tw, objeto);
}
Ok guys, i solved this issue and im just comming to post the final result, just in case anyone needs it, this is the final code where i créate a directory, or validate if it already exists and then créate an XML for any tipe of object that goes in or out of a webservice, so this is the library:
public class xmlLog
{
public int verifyDir(string dir)
{
bool tryDir;
tryDir = Directory.Exists(dir);
if (tryDir == false)
{
return 0;
}
else
{
return 1;
}
}
public string[] createDir(string flow, int enclosure, string transaction, string method)
{
DateTime Hoy = DateTime.Now;
libs.Catalogos objCatalogos = new libs.Catalogos();
string day, month, year, hora, min, seg, time, ruta, fileName, name;
string[] datos = new string[2];
int existe;
name = objCatalogos.convertRecinto(enclosure);
day = System.DateTime.Now.ToString("dd");
month = System.DateTime.Now.ToString("MM");
year = System.DateTime.Now.ToString("yyyy");
hora = System.DateTime.Now.ToString("HH");
min = System.DateTime.Now.ToString("mm");
seg = System.DateTime.Now.ToString("ss");
time = hora + "_" + min + "_" + seg;
ruta = #"C:\inetpub\wwwroot\WsDesarrollo\" + #"XML" + #"\Empresa_" + name + #"\Flujo_" + flow + #"\Año_" + year + #"\Mes_" + month + #"\Dia_" + day + #"\";
existe = verifyDir(ruta);
if (existe == 0)
{
Directory.CreateDirectory(ruta);
}
fileName = "" + ruta + transaction + "_" + method + "_" + time;
datos[0] = ruta;
datos[1] = fileName;
return datos;
}
public void createXML<T>(string route, string fileName, T objeto)
{
string file = Path.Combine(route, fileName + ".xml");
System.Xml.Serialization.XmlSerializer slzr = new System.Xml.Serialization.XmlSerializer(typeof(T));
TextWriter tw = new StreamWriter(file);
slzr.Serialize(tw, objeto);
}
}
At the end of all this mess i managed to create a new directory and create an XML with just 2 code lines every time i need them, wich are the following ones:
string[] = objXML.createDir("IN", Convert.ToInt32(recinto), M903In.transaccionAduana, "903");
objXML.createXML(paramXML[0], paramXML[1], M903In);
I know this wont work for everyone, but this is the way i managed to work with to creade dinamy routes and filenames for XML documents on a webservice.
Hopefully it helps someone :3
I'm trying to run a number of SSRS reports via an SSIS package written in C# using a loop. The problem is that the below code only produces 1 file based on the initial parameters pass through. I think the problem is the ConnectionManager and HttpClientConnection being reused. Is there some other way of doing this?
for (int i = 0; i <= cust.GetUpperBound(0); i++)
{
string varDate = System.DateTime.Now.ToString("dd/MM/yyyy");
string d1ThisMOnth = System.DateTime.Today.AddDays(-(DateTime.Today.Day - 1)).ToString();
var today = DateTime.Today;
var month = new DateTime(today.Year, today.Month, 1);
var first = month.AddMonths(-1);
var last = month.AddDays(-1);
string reportfilename = #"D:\Reports\AllActiveAccounts_" + month.ToString("MMyyyy") + "_" + cust[0, 0] + "." + cust[0, 4];
string url = #"http://" + cust[i, 5] + "/ReportServer?/" + cust[i, 0] + "/Report&rs:Command=Render&location=" + cust[i, 1] + "&clityp=" + cust[i, 2] + "&acctyp=" + cust[i, 3] + "&startdate=" + first.ToString("MM/dd/yyyy") + "&enddate=" + last.ToString("MM/dd/yyyy") + "&rs:Format=" + cust[i, 4] + "&rc:Toolbar=False";
ConnectionManager httpConn = Dts.Connections["ReportServer"];
HttpClientConnection clientConn = new HttpClientConnection(httpConn.AcquireConnection(null));
clientConn.ServerURL = url;
clientConn.DownloadFile(reportfilename, true);
}
It's a bit of a guess, but if I were to. I'd say it's because you're not using your loop counter in your reportfilename parameter. Try changing the filename line to the below.
string reportfilename = #"D:\Reports\AllActiveAccounts_" + month.ToString("MMyyyy") + "_" + cust[i, 0] + "." + cust[i, 4];